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:这通常是一种设计的味道。我并不是说在这种情况下强制转换的要求是气味——我是说情况本身(必须以不同的方式处理集合中的一个元素)就是气味。