1

さまざまな継承オブジェクトを使用して親オブジェクトのリストを作成する方法を見つけようとしています。これが例です。

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クラスのコードを機能させる方法を知っている人はいますか?

4

2 に答える 2

6

あなたのキャストバージョンはほぼ正しいです-それは優先順位のために間違っているだけです。必要なもの:

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

または:

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

このようにキャストする必要性は、一般的に少しデザインの匂いです。気に留めておいてください。回避できるのであれば、そうする価値があります。

于 2012-06-24T17:43:10.970 に答える
5

キャストが有効かどうかわからず、InvalidCastExceptionをスローしたくない場合は、次のように実行できます。

Cube cube = shapes[0] as Cube;
if (cube == null)
{
    // cast is not valid
}
else
{
    cube.CubeFunction();
}
于 2012-06-24T17:58:31.520 に答える