2011-11-17 48 views
4

對於是否使用泛型有一個簡單的問題,如果是的話,這是正確的方法嗎?是否使用泛型?

正常的非泛型版本如下:

public interface IFood 
{ 
    string name { get; set; } 
} 

public class Vegetables : IFood 
{ 
    #region IFood Members 

    public string name 
    { 
     get { return "Cabbage"; } 
     set{ } 
    } 

    #endregion 
} 

public class Cow 
{ 
    private IFood _food; 

    public Cow(IFood food) 
    { 
     _food = food; 
    } 

    public string Eat() 
    { 
     return "I am eating " + _food.name; 
    } 
} 

通用版本如下:

public class Cow<T> where T : IFood 
{ 
    private T _food; 
    public Cow(T food) 
    { 
     _food = food 
    } 

    public string Eat() 
    { 
     return "I am eating " + _food.name; 
    } 
} 

我是對的通用版本所做的一切?是否有必要使用通用版本進行未來發展?這只是原始場景的簡單模擬,但它完全類似。

+6

你需要一個奶牛類是完全獨立於奶牛?或者,一個給定的牛可以餵食穀物,玉米或其他任何通過動物飼料餵食的絨毛嗎?通用版本中的奶牛不是同一個東西,只不過是一個列表與列表相同。另一方面,對我來說,牛是牛。 –

+0

@AnthonyPegram:這應該是一個答案 – Dani

+0

@AnthonyPegram因此,你不建議只使用通用版本,因爲奶牛不同於奶牛。你能解釋一個適當的例子,並在答案部分,因爲我想將它標記爲答案,但不在評論部分 – DotNetInfo

回答

10

我覺得在這個具體的例子中它是一個壞主意。

A List<int>通常被描述爲int列表。 A Cow<IFood>很難形容 - 它當然不是IFood的母牛。這不是一個扣籃扣籃的說法,但顯示了一個潛在的問題。

MSDN狀態:

使用泛型類型最大化代碼重用,類型安全,並 性能。

在你的例子中,通用版本沒有更多的代碼重用,沒有更多的類型安全性和沒有改進的性能。

3

我認爲使用泛型強制執行行爲規則是一個非常糟糕的主意。如果你只想要一頭母牛能夠吃蔬菜,那麼這就更加邏輯了,應該通過邏輯規則來執行,而不是試圖讓編譯器執行它。因此,母牛應該接受所有食物,然後應用邏輯決定如果除了可以吃的東西之外還給它做了什麼。

一個很好的例子就是如果你決定把Hay添加爲奶牛可以吃的東西,那麼就沒有辦法使用泛型來說你可以給奶牛提供蔬菜或乾草,除非你創建了一個IVegetableOrHay接口,這應該使我們都想要殺死那頭牛並且吃它吃晚飯。

編譯器類型執行用於確保正確的程序結構。應用程序邏輯屬於代碼。

1

你想使用泛型擴展/實現子類特性嗎?那麼這不是通用的目的。您將在所有類型的對象具有相同目的的情況下使用泛型。像序列化一樣。在這裏,如果您使COW通用,那麼您必須在COW內部實現COW功能的子類。這不會拒絕另一個子類的遺贈。這裏的COW可以是超類,而不是通用的。我的建議是使用通用的不同系列的類。不在相同的班級中。