2

私は現在小さなゲームに取り組んでおり、OOP の実践について質問があります。私の質問は、親タイプのオブジェクトのリストまたは配列がある場合、子クラスから変数にアクセスする方法があるということです。

私は現在、学校の CS コースに通っているので、ソース コードを持っていませんが、悩まされています。ここで何を探しているのかよくわかりません。おそらくキャスト? 私の OOP の知識は少し散らばっています (スタック オーバーフロー以外の OOP に関する優れたリソースを見つけるのはかなり難しいです。良いチュートリアルを知っている場合は、それを教えてください)。将来の問題に(かなり大規模なプロジェクトです)

ここで私が何を意味するかを説明しましょう (ここでもソースはありませんが、次のようなものです)。

    List<Tile> Tiles = new List<Tile>(); 
    Tiles.add(new Water()); 
    Tiles.add(new Sand()); 

    foreach(Tile tile in Tiles)
    {
         tile.variable_fromsand = 10; //hypothetical, how could I access a public
                                      //member from sand here, if at all
    }

水と砂は基本クラス Tile のサブクラスです。

これが以前に回答されている場合は申し訳ありませんが、探しているものが何であるかわかりません。これが過去に適切に回答されている場合は、正しいスレッドを教えてください。

4

4 に答える 4

3

キャスティングは機能します。

foreach(Tile tile in Tiles)
{
    if (tile is Sand)
         ((Sand)tile).variable_fromsand = 10; 
}
于 2012-11-30T18:02:22.037 に答える
3

Sandキャストするか、タイルだけを選択してみてください。

// if tile is Sand then use casting
foreach(Tile tile in Tiles)
{
     if(tile is Sand)
     {
         ((Sand)tile).variable_fromsand = 10;
     }
}

// select only tiles which are of Sand type
foreach(Sand tile in Tiles.OfType<Sand>())
{
     tile.variable_fromsand = 10;
}
于 2012-11-30T18:00:03.460 に答える
2

私の理解が正しければ、Sand は Tile を継承しており、Tile のリストを反復処理するときにそのプロパティの 1 つを読み取りたいと考えています。

foreach ループでこれを行うためにキャストできます。

var sand = Tile as Sand;
if (sand != null)
{
    // do something with the property of Sand.
}

を使用すると、変数が実際にタイプの場合にasのみ Sand にキャストされます。そこにオブジェクトがある場合、 はを返し、探しているプロパティはありません。tileSand.Waterasnull

于 2012-11-30T18:01:42.037 に答える
1

このようなこともできますが、抽象化には疑問があります。実際に何をしているのかを特定しないため、「これがあなたがすべきことです」と答えるのはかなり難しいです。

foreach(var sand in Tiles.OfType<Sand>())
{
}
于 2012-11-30T18:00:15.257 に答える