C#如何从父列表访问继承的对象
我正试图找到一种方法,用各种继承的对象创建一个父对象列表。这里有一个例子C#如何从父列表访问继承的对象,c#,list,object,parent,inherited,C#,List,Object,Parent,Inherited,我正试图找到一种方法,用各种继承的对象创建一个父对象列表。这里有一个例子 class Prog { public Prog ( ) { List<Shape> shapes = new List<Shape>(); shapes.Add( new Cube() ); shapes.Add( new Shape() ); //All those ways will not work, I cannot
class Prog {
public Prog ( ) {
List<Shape> shapes = new List<Shape>();
shapes.Add( new Cube() );
shapes.Add( new Shape() );
//All those ways will not work, I cannot figure a way how to do this
shapes[0].CubeFunction();
(Cube)shapes[0].CubeFunction();
Cube cube = shapes[0];
}
}
class Shape {
public Shape (){}
}
class Cube : Shape {
public Cube (){}
public void CubeFunction(){}
}
class程序{
公共程序(){
列表形状=新列表();
添加(新立方体());
添加(新形状());
//所有这些方法都行不通,我想不出一个方法来做到这一点
形状[0]。立方函数();
(立方体)形状[0]。立方体函数();
立方体=形状[0];
}
}
阶级形态{
公共形状(){}
}
类立方体:形状{
公共多维数据集(){}
public void CubeFunction(){}
}
有人知道如何让Prog类中的代码工作吗?您的cast版本几乎是正确的-它只是因为优先级而错误。您需要:
((Cube)shapes[0]).CubeFunction();
或者:
Cube cube = (Cube) shapes[0];
cube.CubeFunction();
像这样施放的需要通常有点设计的味道,请注意——如果你能避免,那么尝试这样做是值得的。你的施放版本几乎是正确的——它只是因为优先权而错误。您需要:
((Cube)shapes[0]).CubeFunction();
或者:
Cube cube = (Cube) shapes[0];
cube.CubeFunction();
注意,像这样施法的需要通常有一点设计的味道——如果你能避免,那么尝试这样做是值得的。如果你不确定施法是否有效并且不想被抛出,你可以这样做:
Cube cube = shapes[0] as Cube;
if (cube == null)
{
// cast is not valid
}
else
{
cube.CubeFunction();
}
如果您不确定强制转换是否有效,并且不希望抛出,可以执行以下操作:
Cube cube = shapes[0] as Cube;
if (cube == null)
{
// cast is not valid
}
else
{
cube.CubeFunction();
}
为什么这是一种设计的味道?编译器如何知道类型是什么?我希望Eric没有读到你的评论<代码>:)非常感谢您的快速回答:)@gdoron:这通常是一种设计的味道。我并不是说在这种情况下铸造的要求是气味——我是说情况本身(必须以不同的方式处理集合中的一个元素)是一种气味。为什么它是一种设计气味?编译器如何知道类型是什么?我希望Eric没有读到你的评论<代码>:)非常感谢您的快速回答:)@gdoron:这通常是一种设计的味道。我并不是说在这种情况下强制转换的要求是气味——我是说情况本身(必须以不同的方式处理集合中的一个元素)就是气味。