一千萬個為什麽

搜索

泛型與繼承(當不涉及集合類時)


這是此問題的擴展,可能可能甚至是一些其他問題的副本(如果是,請原諒我)。我從MSDN 看到泛型通常是用於收藏

通用的最常見用途   類與集合一樣   鏈表,哈希表,堆棧,   隊列,樹木等等   添加和刪​​除等操作   該系列中的物品是   以同樣的方式表演   無論數據類型如何   存儲

我看到的例子也驗證了上述陳述。

有人可以在不涉及任何集合的現實場景中有效地使用泛型嗎?

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

public class Animal
{
    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());

    }
}         

和“動物類型狗”將是

Animal magic = new Animal();

It is entirely possible to have Dog getting inherited from Animal (Assuming a non-generic version of Animal)Dog:Animal Therefore Dog is an Animal

Another example I was thinking was a BankAccount. It can be BankAccount,BankAccount. This can very well be Checking:BankAccount and Savings:BankAccount.

是否有任何最佳實踐來確定我們是否應該使用泛型或繼承?

最佳答案

你可能會得到一些更好的答案,但同時考慮一下: 泛型類意味著泛型類和參數類之間的“關系”。

所有的狗都是動物,因此它們與所有其他動物共享某些屬性/品質。如果使用繼承,則很容易在Animal類中實現這些常用品質,並在後代類中添加品質。但是如果你使用 Animal(Of Dog)來實現它,那麽:

  1. 您的Dog類本身並不是一個完全合格的狗/動物,因為它的“動物品質”包含在 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)

關鍵點:泛型類和參數類沒有緊密耦合和共同依賴,它們共存。

順便說一句,如果你想看到一些非常好的非收集使用泛型,請註意我們的代表:Action(Of T),Func(Of Traesult),Comparison(Of T),EventHandler(Of TEventArgs),Converter(Of TSource,TResult)......和接口:IEqualityComparer(Of T),IComparer(Of T)......

轉載註明原文: 泛型與繼承(當不涉及集合類時)

猜你喜歡