gpt4 book ai didi

C# 泛型 : wildcards

转载 作者:IT王子 更新时间:2023-10-29 04:33:49 26 4
gpt4 key购买 nike

我是 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 接口(interface),即它(在编译时)绑定(bind)到 IAnimal 的特定实例。此外,IAnimalGroomer 的具体类不需要一直转换它们的IAnimals,因为泛型会强制实现处理一种特定的动物。我以前在 Java 中使用过这个习惯用法,我只是想知道是否有类似的方法可以在 C# 中编写它。

编辑 2:很多有趣的讨论。我正在接受一个答案,该答案将我指向评论中的动态调度。

最佳答案

您想要的是调用站点协方差,这不是 C# 支持的功能。 C# 4 及更高版本支持泛型变体,但不支持调用站点变体。

但是,这对您没有帮助。您希望将狗美容师放入动物美容师列表中,但这在 C# 中行不通。宠物美容师不能用于需要动物美容师的任何情况,因为狗美容师只能为狗美容,但动物美容师也可以为猫美容。也就是说,当接口(interface)不能以协变方式安全使用时,您希望接口(interface)协变

但是你的IAnimalGroomer<T>界面可能是逆变的:动物美容师可以在需要狗美容师的环境中使用,因为动物美容师可以给狗美容。如果你做了 IAnimalGroomer<T>通过添加 in 实现逆变到T的声明那么你可以放一个IAnimalGroomer<IAnimal>进入 IList<IAnimalGroomer<Dog>> .

一个更现实的例子,想想IEnumerable<T>对比IComparer<T> .狗的序列可以用作动物的序列; IEnumerable<T>协变的。但是动物序列不能用作狗序列;那里可能有一只老虎。

相比之下,比较动物的比较器可以用作狗的比较器; IComparer<T>逆变。但是狗的比较器不能用来比较动物;有人可以尝试比较两只猫。

如果仍然不清楚,请先阅读常见问题解答:

http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx

然后回来问更多问题(如果有的话)。

关于C# 泛型 : wildcards,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19283349/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com