5

これは一種の「宿題っぽい」および/または些細なことのように見えるかもしれませんが、それは実際のビジネス目的のためです。それは、私が概念的にやろうとしていることを説明するために私が考えることができる最も簡単な方法です。

動物のクラスと他のいくつかのクラス(鳥、猫、カンガルー)があるとします。これらはそれぞれ、Animalから継承しています。

動物は次のようになります。

public class Animal
{
    public Animal()
    {

    }

    public string Name { get; set; }
    public string AnimalType { get; set; }
    public List<Animal> Friends { get; set; }
}

カンガルーは次のようになります。

public class Kangaroo : Animal
{
    public Kangaroo()
    {

    }

    public int TailLengthInches { get; set; }
}

カンガルーに鳥と猫の2人の友達がいるとします。それらを「動物」の友達のリストに(動物タイプとして)追加し、派生クラスのプロパティにアクセスする機能を保持するにはどうすればよいですか?(のように、鳥のFeatherColorなど、動物のタイプに固有のプロパティを操作できる必要があります。たとえば、それらは単なる「動物」と見なされます。

私がこれをやろうとしている理由は、後で動物の「友達」のリストを取得するときに、友達がどんな種類の動物であるかを知ることが重要だからです。動物の種類(鳥、猫など)に応じて、別のことをしたいと思います(実際には、ASP.NETページに別のテンプレートを表示しますが、特にサポートは必要ありません)。

要約すると、これに要約されます...動物のリストがある場合、リスト内の各オブジェクトの派生型が何であるかをどのように知ることができるので、それらを派生型にキャストバックするか、他のことを行うことができますこれにより、派生タイプごとにある特定の異なるプロパティにアクセスできますか?

ありがとう!

4

5 に答える 5

8

LINQを使用して、探しているタイプでフィルター処理できます

animals.Friends = new List<Animal> { new Kangaroo(), new Bird() };
foreach ( var kangaroo in animals.Friends.OfType<Kangaroo>()) {
  kangaroo.Hop();
}
于 2010-01-15T21:17:04.920 に答える
2

キャストしてみてください:

var friendBird = friend as Bird;
if (friendBird != null)
{
    // It's a bird, so do something with it
)
于 2010-01-15T21:09:32.923 に答える
2

を使用typeofして実際の型を取得するか、isまたはas演算子を使用してテストし、オプションでキャストすることができます。

foreach (Animal a in Friends)
{
  Kangaroo k = a as Kangaroo;
  if (a != null)
  {
    // it's a kangaroo
    k.JumpAround();
  }
  Ostrich o = a as Ostrich;
  if (o != null)
  {
    o.StickHeadInSand();
  }
}

elseここでは句を使用していません。階層内にある可能性のある型に対してテストしている場合、エラーが発生する可能性があります。たとえば、カンガルー句と有袋類句の両方がある場合は、両方を実行したくないでしょう!)

演算子を使用してこれを行うこともできますis。これは見栄えが良くなりますが、FxCopが泣きます。

foreach (Animal a in Friends)
{
  if (a is Kangaroo)
  {
    ((Kangaroo)a).JumpAround();
  }
}

Animal一般に、ちなみに、派生クラスの特定のセットに脆弱な結合をもたらすモンスターのifステートメントを使用するのではなく、仮想メソッドを配置してそのメソッドを多態的に実装する機会を探したいと思うでしょう。

于 2010-01-15T21:11:57.623 に答える
0

'is'キーワードを使用します。

if(動物は鳥)..。

于 2010-01-15T21:12:40.483 に答える
0
animals.Friends = new List<Animal> { new Kangaroo(), new Bird() };
foreach (Animal animal in animals.Friends)
{
if (animal is Kangaroo)
Console.WriteLine("Kangaroo");
else if (animal is Bird)
Console.WriteLine("Bird");
}
于 2010-01-15T21:15:02.417 に答える