我正在尝试一些简单的代码来理解C#中的泛型。这里代码的目的是让一个拥有自己动物的训练师,并要求它做各种事情(为了这个例子,跳跃)。
问题在于培训师的构造者。我希望能够通过一只狗或一只猫。它们都继承自同一个类,但由于我指定了类型定义,我似乎无法将它们作为参数传递,它们不能同时有效。有没有办法指定像“动物”这样的通用类,所以我可以传递一只狗或一只猫并将其作为成员保留?
CatTrainer : Trainer<CatDefinition>
编辑:Chris Berger的回答之后的其他问题(有效,但我没有更改代码以保持问题/答案合乎逻辑)。我在Animal类中添加了一个定义成员。有什么方法可以从Trainer课程中访问Bark或Meow,还是我必须使用if(T is CatDefinition)
{ // Meowing}
else
{}
推导出类训练师?也就是说,是否有类似于我们对类的内容,
{{1}}
答案 0 :(得分:2)
我认为我同意第一位评论者的意见,你不一定要为此做泛型,但假设你有其他理由想要泛化......
这里的解决方案是创建一个Animal类,Animal&lt; T&gt;源于。
例如:
public class Animal<T> where T : AnimalDefinition
{
public void Jump()
{
Console.WriteLine("Jump.");
}
}
public class Dog : Animal<DogDefinition> {}
public class Cat : Animal<CatDefinition> {}
public class Trainer<T> where T : AnimalDefinition
{
Animal<T> _animal;
public Trainer(Animal<T> myAnimal)
{
_animal = myAnimal;
}
public MakeJump()
{
_animal.Jump();
}
}
或者,实际上,第二个选项是让Trainer可以看到通用参数:
public class Animal<T> where T : Animal<T> { }
public class Dog : Animal<Dog> { }
作为切线......这可能是使用自引用泛型的好地方。
aws
这里有关于该模式的更多信息:https://blogs.msdn.microsoft.com/simonince/2008/06/12/generics-the-self-referencing-generics-pattern/