次の例で、私が解決している問題について説明します。
class Animal {}
class Cat: Animal {}
class Dog : Animal { }
interface IAnimalHandler<in T> where T: Animal
{
void Handle(T animal);
}
class AnimalHandler :
IAnimalHandler<Cat>,
IAnimalHandler<Dog>
{
public void Handle(Cat animal)
{
Console.Write("it's a cat !");
}
public void Handle(Dog animal)
{
Console.Write("it's a dog !");
}
}
だから今、私はすべての動物を調べて、次のような適切なハンドラーを実行したいと思います:
var ah = new AnimalHandler();
var animals = new List<Animal> { new Cat(), new Dog() };
animals.ForEach(a => ah.Handle(a));
ただし、.NETコンパイラがコンパイル前にここで使用されているタイプを知る必要があるという理由だけで、このコードは機能しません(メソッドHanler <> ...を解決できません)。この問題の最善の解決策は何でしょうか。言い換えると、実行時にタイプTのすべてのインスタンスに対してタイプTの適切なハンドラーを取得するように.NETコンパイラーに依頼する必要があります。if
インスタンスタイプをチェックする複数のステートメントを使用したくありません。
更新:それを見逃して申し訳ありませんが、それは私には明白に見えましたが、今ではそれほど明白ではないことを理解しています:AnimalHandlerクラスには、ドメインオブジェクトCatおよびDogの一部ではないロジックが含まれています。それらを純粋なプレーンドメインオブジェクトと考えてください。どのような種類のハンドラーについても知られたくないのです。