我是 c# 世界的新手,我正试图围绕泛型。这是我目前的问题:
public Interface IAnimal{
string getType();
}
public Interface IAnimalGroomer<T> where T:IAnimal{
void groom(T);
}
现在我想要一本包含这些动物美容师的字典。我怎么做?在java中,我可以做这样的事情:
HashMap<String,IAnimalGroomer<?>> groomers = new HashMap<>();
编辑:这是我正在尝试做的一个例子:
public class Dog : IAnimal
{
public string GetType()
{
return "DOG";
}
public void ClipNails() { }
}
public class DogGroomer : IAnimalGroomer<Dog>
{
public void Groom(Dog dog)
{
dog.ClipNails();
}
}
public class Program
{
private List<IAnimalGroomer<IAnimal>> groomers = new List<IAnimalGroomer<IAnimal>>();
public void doSomething()
{
//THIS DOESN"T COMPILE!!!!
groomers.Add(new DogGroomer());
}
}
编辑 我认为我的意图在原帖中不清楚。我的最终目标是制作一个使用不同类型的 IAnimalGroomers 的 AnimalGroomerClinic。然后动物主人可以把动物送到诊所,诊所可以决定由哪个美容师来照顾动物:
public class AnimalGroomerClinic
{
public Dictionary<String, IAnimalGroomer> animalGroomers = new Dictionary<String,IAnimalGroomer>();
public void employGroomer(IAnimalGroomer groomer){
animalGroomers.add(groomer.getAnimalType(), groomer);
}
public void Groom(IAnimal animal){
animalGroomers[animal.getAnimalType()].Groom(animal);
}
}
我意识到我可以在不使用泛型的情况下做到这一点。但是泛型允许我编写IAnimalGroomer
接口,使其(在编译时)绑定到IAnimal
. 此外,具体的类IAnimalGroomer
不需要IAnimals
一直强制转换,因为泛型会强制实现处理一种特定的动物。我以前在 Java 中使用过这个习语,我只是想知道是否有类似的方法可以在 C# 中编写它。
编辑2: 很多有趣的讨论。我正在接受一个答案,该答案指出我在评论中进行动态调度。