泛型与继承(当不涉及集合类时)

ram*_*ram 12 .net c# generics inheritance

这是这个问题的延伸,可能甚至可能是其他一些问题的重复(如果是,请原谅我).我在MSDN上看到泛型通常与集合一起使用

对于泛型类最常见的用途是一个像链表,哈希表,栈,队列,树的集合等在那里,如添加和删除收集的项目操作在几乎相同的方式数据彼此的类型进行不分存储.

我见过的例子也证实了上述说法.

有人可以在不涉及任何集合的现实场景中有效地使用泛型吗?

小心翼翼地,我正在考虑制作一个不涉及收藏的例子

public class Animal<T>
{
    public void Speak()
    {
       Console.WriteLine("I am an Animal and my type is " + typeof(T).ToString());
    }

    public void Eat()
    {
        //Eat food
    }
}

public class Dog
{
    public void WhoAmI()
    {
        Console.WriteLine(this.GetType().ToString());

    }
}         
Run Code Online (Sandbox Code Playgroud)

和"动物类型的狗"将是

Animal<Dog> magic = new Animal<Dog>();

完全有可能Dog继承自Animal(假设非泛型版本Animal)Dog:Animal因此Dog 是一个 Animal

我想的另一个例子是 BankAccount.它可以是BankAccount<Checking>,BankAccount<Savings>.这很可能是Checking:BankAccountSavings:BankAccount.

是否有任何最佳实践来确定我们是否应该使用泛型或继承?

M.A*_*nin 8

你可能会得到一些更好的答案,但同时要考虑这一点:泛型类意味着泛型类和参数类之间的"关系".

所有的狗都是动物,因此它们与所有其他动物共享某些属性/品质.如果使用继承,那么在Animal类中实现这些常见特性非常容易,并在后代类中添加特性.但是如果你使用它来实现它Animal (Of Dog),那么:

  1. 你的狗类本身并不是一个完全合格的狗/动物,因为它的"动物品质"包含在Animal (Of T)课堂上.狗必须与亲子关系中的动物绑在一起.
  2. 你的Animal类不是真正的动物:你不能创建一些接受动物作为参数的方法,因为你不能引用全球化的Animal (Of T)类.它实际上是一个具有共同行为的类系列,而不是超类.你失去了在Animal (Of T)课堂外与动物打交道的好处.

但是,恕我直言,你应该如何看待泛型:想想一个MedicalDoctor(Of T)阶级. Veterinarian(Of T as Animal)将继承自MedicalDoctor(Of Animal). DogVeterinarian将继承自Veterinarian(Of Dog).

关键点:泛型类和参数类没有紧密耦合和共同依赖,它们共存.

顺便说一句,如果你想看到泛型的一些好收不上来使用,只是注意到我们有代表:动作(中T),Func键(中TResult),比较(中T),事件处理(TEventArgs中,转化器中TSource,TResult)......和接口:IEqualityComparer(Of T),IComparer(Of T)......