【问题标题】:C# How to access inherited object from parent ListC#如何从父列表访问继承的对象
【发布时间】:2012-06-24 17:41:43
【问题描述】:

我正在尝试找到一种方法来制作包含各种继承对象的父对象列表。这是一个例子。

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(){}
}

有人知道如何让 Prog 类中的代码工作吗?

【问题讨论】:

    标签: c# list object parent inherited


    【解决方案1】:

    您的演员表几乎是正确的 - 只是因为优先级而出错。你需要:

    ((Cube)shapes[0]).CubeFunction();
    

    或者:

    Cube cube = (Cube) shapes[0];
    cube.CubeFunction();
    

    请注意,像这样进行投射的需要通常有点设计味道 - 如果可以避免,那么值得尝试这样做。

    【讨论】:

    • 为什么会有设计的味道?编译器怎么知道类型是什么?我希望埃里克没有看到你的气味评论...:)
    • 非常感谢您这么快的回答:)
    • @gdoron:需要这样做通常是一种设计风格。我并不是说在这种情况下投射的要求是气味 - 我是说情况本身(必须以不同的方式处理集合的一个元素)是一种气味。
    【解决方案2】:

    如果您不确定演员表是否有效并且不想抛出 InvalidCastException,您可以这样做:

    Cube cube = shapes[0] as Cube;
    if (cube == null)
    {
        // cast is not valid
    }
    else
    {
        cube.CubeFunction();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多