2

たまたまタイルである約100個のオブジェクトのリストがあります。次のようになります。

 List<Tile> Tiles;

私のコードの他の場所には、タイル基本クラスから派生したクラスがあります。この例では house を使用します。

 public class house : Tile

一番上のリストの中に、さまざまなタイプのタイルをデータ構造に追加しました。

 Tiles.add(new house());
 Tiles.add(new church()); //ect. ect.

私の質問は、for ループのような制御構造を介してそのリストをどこで参照すれば、どのタイルが教会または家であるかをどのように知ることができるかということです。基本的に、異なるタイプの 2 つのタイルを一緒に比較する必要があります。私が参照している子クラスを知ることさえ可能ですか? これには簡単な説明があると思いますが、オブジェクト指向プログラミングに関してはあまり詳しくないので、助けになるときに何を探しているのか完全にはわかりません.

4

5 に答える 5

5

ここにはさまざまなオプションがあります

  • is/を使用asして、特定のオブジェクトをチェックして、それが特定のタイプであるかどうかを確認できます
  • .TileTypeディスクリミネーターを追加できます-おそらく(比較: Expression.NodeType)などの列挙型プロパティ
  • 代わりにメソッドを使用して、タイプが何であるかを知る必要virtualがないようにすることもできます。「タイプがここで行うことは何でも実行してください」と言うだけです (つまり、仮想メソッドを呼び出します)。
于 2012-05-28T08:40:37.110 に答える
2

「is」演算子を使用できます-「Tiles [index] is house」

しかし、一般的にこれは悪いことです -あなたはおっと原則を破ります

派生クラスにメソッドを実装するために何をすべきか。そうすれば、派生クラス自体がロジックを実行する方法を理解し、「is」演算子を使用する必要がなくなります。

于 2012-05-28T08:39:22.013 に答える
1

さて、あなたはこれを行うことができます:

foreach (var house in Tiles.OfType<house>()) { ..
于 2012-05-28T08:39:50.163 に答える
0

Object.GetType()現在のインスタンスの Type を取得するために使用します。

MSDN リンクを参照

于 2012-05-28T08:40:17.153 に答える
0
foreach (Tile tile in Tiles)
{
    if (tile is house)
    {
        // do things
    }
}

上記のように is キーワードを使用できます。

于 2012-05-28T08:38:55.330 に答える