【发布时间】:2012-07-17 17:13:23
【问题描述】:
让我在下面的示例中向您解释我要解决的问题:
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));
但是这段代码不起作用(无法解析方法 Hanler...)只是因为 .NET 编译器需要在编译之前知道这里使用的是哪种类型,所以什么可能是最好的这个问题的解决方案?换句话说,我需要让 .NET 编译器为每个类型 T 在运行时的实例采用适当的类型 T 处理程序。
我不想使用多个if 语句检查实例类型。
更新:很抱歉错过了它,这对我来说似乎很明显,但现在我明白它并不那么明显:AnimalHandler 类包含不应该是域对象 Cat 和 Dog 的一部分的逻辑。将它们视为纯粹的域对象,我不希望它们知道任何类型的处理程序
【问题讨论】:
-
有什么理由不能或不想将特定行为放入具体的
Cat和Dog类型中? -
要跟进@FishBasketGordo,您是否有理由将功能放入 AnimalHandler 类中?即,
Animal类有一个抽象属性Name,Cat和Dog类实现(也可以通过接口完成),然后AnimalHandler变得更简单,并且只引用animal.Name或随便 -
@FishBasketGordo:这是我尝试实现的一个非常简化的模型。不,Cat 和 Dog 不能自己处理,因为它们是域模型对象,而 AnimalHandler 包含业务或 UI 或其他类型的逻辑,不应该在域类中。