2012-06-25 165 views
0

我已經實現Generices如下:泛型和抽象類

public class GenericAnimal<T> 
    { 
    public int legs; 
    public void Walk() 
    { 
     Console.WriteLine("Animals Walk...."); 
    } 
} 

public class Dog 
{ 
    public void Bark() 
    { 
     Console.WriteLine("Barking...."); 
    } 
} 

public class Cat 
{ 
    public void Mew() 
    { 
     Console.WriteLine("Mewing...."); 
    } 
} 

然後我用類如下:

 GenericAnimal<Dog> dogObj = new GenericAnimal<Dog>(); 
     GenericAnimal<Cat> catObj = new GenericAnimal<Cat>(); 

在這兩個dogObj和catObj,我正在「走「 方法。這件事我可以用抽象類來做。那麼使用泛型對抽象類的附加優勢是什麼?

+0

在你的例子中generic不可用。 –

+8

7個問題,但沒有被接受的答案 - 如果你可以請標記一個問題,以回答你以前的帖子? – Kane

+0

做你的dogObj樹皮?你的catObj喵? –

回答

5

在你的情況下,沒有。泛型在您希望代碼可以與不同類型重用的場景中有意義。在GenericAnimal<T>,你沒有做任何事情與T

0

嘗試寫來代替:

public class Animal 
{ 
    public int legs; 
    public void Walk() 
    { 
     Console.WriteLine("Animals Walk...."); 
    } 
} 

public class Dog : Animal 
{ 
    public void Bark() 
    { 
     Console.WriteLine("Barking...."); 
    } 
} 

public class Cat : Animal 
{ 
    public void Mew() 
    { 
     Console.WriteLine("Mewing...."); 
    } 
} 

,並嘗試做兩份清單:第一個是貓只列出,第二個是狗的名單唯一的 - 第一,而無需使用List<T>,然後嘗試使用List<T>。我認爲,這將有助於你更好地理解它

0

你的代碼更改爲下一個

public class GenericAnimal<T> 
{ 
    public T Instance{get;set;} 
    public int legs; 
    public void Walk() 
    { 
     Console.WriteLine("Animals Walk...."); 
    } 
} 

而你,也就能夠使用DogCat。但是,眼鏡爲這種情況描述了更好的代碼。

1

GenericsInheritance是兩個完全不同的概念,具有完全不同的功能。沒有這樣的比較「使用泛型相對於抽象類的附加優勢是什麼?」。如果您可以從所有您的子對象中抽象出一些常用的功能,那麼使用Abstract class是有意義的。 Here是關於Generics的更多信息。

1

您的具體示例最好通過沒有泛型的正常繼承來解決 - Dog和Cat子類Animal。但是,現在說你想要一個動物列表。作爲非通用的解決方案,您可以選擇一個ArrayList,您可以添加cat和dog實例。但是,ArrayList的Add方法將一個對象作爲參數。因此,你也可以在列表中添加一條魚,並且一條魚不能走路。當你處理列表以告訴所有的動物走路時,你首先必須檢查它們是否是動物。

這是泛型幫助的地方。您可以使用List < Animal>定義您的列表,然後只能將符合「is Animal」的對象添加到列表中。假設一條魚不是動物,那麼如果你嘗試添加一條魚,你會得到一個編譯器錯誤。此外,當您獲得列表中的項目時,您將獲得動物實例而不僅僅是對象,因此您可以讓他們立即走路。