C# 如何从数组强制转换对象
一个简单的问题 我有一个抽象类Cell和两个类BorderCell和BoardCell,它们继承自Cell类。然后我有一个Cell[]类型的Cells数组,其中包含BorderCell和BoardCell类型的对象C# 如何从数组强制转换对象,c#,casting,C#,Casting,一个简单的问题 我有一个抽象类Cell和两个类BorderCell和BoardCell,它们继承自Cell类。然后我有一个Cell[]类型的Cells数组,其中包含BorderCell和BoardCell类型的对象 abstract class Cell { } class BorderCell : Cell { public void Method1(){}; } class BoardCell: Cell { public void Method2(){}; } ...
abstract class Cell
{
}
class BorderCell : Cell
{
public void Method1(){};
}
class BoardCell: Cell
{
public void Method2(){};
}
...
Cell[] Cells = new Cell[x];
for (int i = 0; i < x; i++){
Cells[i] = new BorderCell();
// or
Cells[i] = new BoardCell();
}
但这不起作用,我必须使用:
BorderCell borderCell = (BorderCell)Cells[i];
borderCell.Method1();
这是唯一(也是正确的方法)做到这一点吗?不,你只需要用括号来清楚地说明你想让演员扮演什么:
((Border)Cells[i]).Method1();
基本上,“.”绑定比强制转换更紧密,因此您的原始代码:
(Border)Cells[i].Method1();
相当于:
(Border) (Cells[i].Method1());
不需要,您只需要用括号来清楚说明您希望强制转换应用于什么:
((Border)Cells[i]).Method1();
基本上,“.”绑定比强制转换更紧密,因此您的原始代码:
(Border)Cells[i].Method1();
相当于:
(Border) (Cells[i].Method1());
尝试:
如果将括号用于转换,则括号提供类型边界。您的第一次尝试没有包装单元格[i]。请尝试:
如果将括号用于转换,则括号提供类型边界。您的第一次尝试没有包装单元格[i]。写入时
(BorderCell)Cells[i].method1();
强制转换应用于表达式单元格[i].method1()
,它显然不起作用,因为单元格[i]
仍然返回一个单元格
如果您想保留一个额外的变量,请写入:
((BorderCell)Cells[i]).method1();
当你写作时
(BorderCell)Cells[i].method1();
强制转换应用于表达式单元格[i].method1()
,它显然不起作用,因为单元格[i]
仍然返回一个单元格
如果您想保留一个额外的变量,请写入:
((BorderCell)Cells[i]).method1();
因为您在数组中放置了两种类型的单元格(BorderCell和BoardCell)。我建议在铸造之前先检查类型
if (Cells[i] is BorderCell)
{
// cast to BorderCell
}
else
{
// cast to BoardCell
}
因为您在数组中放置了两种类型的单元格(BorderCell和BoardCell)。我建议在铸造之前先检查类型
if (Cells[i] is BorderCell)
{
// cast to BorderCell
}
else
{
// cast to BoardCell
}
乔恩今天(和往常一样)扣动扳机很快!乔恩今天(和往常一样)扣动扳机很快!我想在这里回顾一下你的设计——必须回溯到派生类是一种糟糕的设计味道——如果你将它们保存在与基类型相同的集合中,我希望它们是真正多态的(Liskov原理)。Herbie博士:我愿意接受建议,查看此线程:我会在这里查看您的设计--必须强制转换为派生类是一种糟糕的设计气味--如果您将它们保存在与基类型相同的集合中,我希望它们是真正多态的(Liskov原则)。Herbie博士:我愿意接受建议,查看此线程:这取决于。如果代码知道应该在哪里有BorderCells,那么我们确信如果类型错误,表明存在bug,那么强制转换是正确的方法。确实,业务逻辑坚持认为,如果一个单元格位于特定的loaction中,那么它应该具有正确的类型。看:那要看情况。如果代码知道应该在哪里有BorderCells,那么我们确信如果类型错误,表明存在bug,那么强制转换是正确的方法。确实,业务逻辑坚持认为,如果一个单元格位于特定的loaction中,那么它应该具有正确的类型。见: