一个简单的问题......
我有一个抽象类Cell和两个类BorderCell和BoardCell,它们继承自Cell类。然后我有一个Cell数组,其类型为Cell [],其中包含BorderCell和BoardCell类型的对象。
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并运行它的Method1,如下所示:
(Border)Cells[i].Method1();
但这不起作用,我必须使用:
BorderCell borderCell = (BorderCell)Cells[i];
borderCell.Method1();
这是唯一(并且正确的方式)这样做吗?
答案 0 :(得分:7)
不,你只需要用括号来清楚你想要演员要应用的内容:
((Border)Cells[i]).Method1();
基本上是“。”绑定比演员更紧,所以原始代码:
(Border)Cells[i].Method1();
相当于:
(Border) (Cells[i].Method1());
答案 1 :(得分:4)
尝试:
((BorderCell)Cells[i]).Method1();
如果您使用铸造,括号会提供类型边界。你的第一次尝试没有包裹Cell [i]。
答案 2 :(得分:3)
写作时
(BorderCell)Cells[i].method1();
广告素材已应用于Cells[i].method1();
表达式,由于Cells[i]
仍然会返回Cell
,因此显然无效。
如果您想要备用其他变量,请写下:
((BorderCell)Cells[i]).method1();
答案 3 :(得分:2)
由于您将2种类型的单元格(BorderCell和BoardCell)放入数组中。我建议在施法前先检查一下类型。
if (Cells[i] is BorderCell)
{
// cast to BorderCell
}
else
{
// cast to BoardCell
}