gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:23:06 26 4
gpt4 key购买 nike

这是 this question 的扩展甚至可能是其他一些问题的重复(如果是这样,请原谅我)。我 see from MSDN泛型通常与集合一起使用

The most common use for generic classes is with collections like linked lists, hash tables, stacks, queues, trees and so on where operations such as adding and removing items from the collection are performed in much the same way regardless of the type of data being stored.

我看到的例子也验证了上述说法。

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

迂腐地,我想做一个不涉及集合的例子

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());

}
}

和“An Animal of type Dog”将是

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

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

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

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

最佳答案

您可能会得到一些更好的答案,但同时考虑一下:泛型类隐含了泛型类和参数类之间的“of”关系。

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

  1. 您的 Dog 类本身并不是完全合格的狗/动物,因为它的“动物特性”包含在 Animal (Of T) 类中。 Dog 必须与 Animal 建立亲子关系。
  2. 您的 Animal 类并不是真正的动物:您不能创建一些接受 Animals 作为参数的方法,因为您不能引用全局化的 Animal (Of T) 类。它实际上是具有共同行为的类族,而不是父类(super class)。你失去了处理 Animal (Of T) 类之外的 Animals 的好处。

但是,恕我直言,您应该如何看待泛型:考虑一个 MedicalDoctor(Of T) 类。Veterinarian(Of T as Animal) 将继承自 MedicalDoctor(Of Animal)DogVeterinarian 将从 Veterinarian(Of Dog) 继承。

重点:泛型类和参数类不是紧耦合和相互依赖的,它们是共存的。

顺便说一句,如果你想看到泛型的一些好的非集合用法,只需注意我们的委托(delegate):Action(Of T)、Func(Of TResult)、Comparison(Of T)、EventHandler(Of TEventArgs)、 Converter(Of TSource, TResult)... 和接口(interface):IEqualityComparer(Of T), IComparer(Of T)...

关于c# - 泛型与继承(当不涉及集合类时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2642598/

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