传递继承的类

时间:2017-05-01 22:37:53

标签: c#

我正在尝试一些简单的代码来理解C#中的泛型。这里代码的目的是让一个拥有自己动物的训练师,并要求它做各种事情(为了这个例子,跳跃)。

问题在于培训师的构造者。我希望能够通过一只狗或一只猫。它们都继承自同一个类,但由于我指定了类型定义,我似乎无法将它们作为参数传递,它们不能同时有效。有没有办法指定像“动物”这样的通用类,所以我可以传递一只狗或一只猫并将其作为成员保留?

CatTrainer : Trainer<CatDefinition>
编辑:Chris Berger的回答之后的其他问题(有效,但我没有更改代码以保持问题/答案合乎逻辑)。我在Animal类中添加了一个定义成员。有什么方法可以从Trainer课程中访问Bark或Meow,还是我必须使用if(T is CatDefinition) { // Meowing} else {} 推导出类训练师?也就是说,是否有类似于我们对类的内容,

{{1}}

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/