2010-11-04 42 views
0

除了收集類的情況之外,我無法找到泛型類的需求。像堆棧和鏈表等項目。泛型類的價值?

我可以看到人們也在其他地方使用它。

我們使用泛型類獲得了什麼?

回答

1

那麼讓我們說你有repersents數據庫表中的類,你會需要像Save()方法,Delete() - 這在任何數據庫表的實體工作,不分類型,它們都運行相同的方式(一通用方式)。

所以要解決,你可以使用一個通用類,像這樣:

public class BaseEntityModel<T> where T : IEntity2 // We use llblgen here 
{ 
    // ... code 

    // T is a generic type parameter which has to implement IEntity2. 
    // But we don't care what type it is. 
    public T Entity { get; set; } 

    public void Save() 
    { 
      Entity.Save(); // Save is from IEntity2 
    } 

    // ... code 
} 

那麼對於一個客戶類,我們可以這個樣子

public class Customer : BaseEntityModel<CustomerEntity> 
{ 
    public void Method() 
    { 
     // Entity is of type Customer entity 
     Entity.CustomerName = "Bob"; 
     base.Save(); 
    } 

} 

,然後一個公司

public class Company : BaseEntityModel<CompanyEntity> 
{ 
    public void Method() 
     { 
     // Entity is of type Company entity 
     Entity.CompanyName = "My Company"; 
     base.Save(); // Save is declared in the base class for a generic type (in this case company) 
    } 

} 

這個代碼示例,它允許在不同類型的對象上使用相同的通用代碼,並且c被約束到某些類型的對象(使用where T : IMyInterface

有更多的方法來約束我可以使用的對象的類型。此信息是MSDN

+0

+1:用於給出*具體*使用泛型類。 – rsenna 2010-11-04 02:34:57

1

MSDN在Advantages and Limitations of Generics上有一篇非常全面的文章。基本上,當使用泛型時,可以減少類型檢查的麻煩,以確保類型安全性,類型兼容性等等。它們在編譯時都會爲您處理。

他們可以幫助你避免重複代碼 - 例如,而不是寫FooMethod(int arg)FooMethod(string arg)等,你可以只寫FooMethod<T>(T arg),這是更清潔和更容易維護。

另請注意,您可以使用where關鍵字添加constraints on generic type parameters。這對於確保泛型類型參數實現某個接口,或者使用默認的無參數構造函數等非常有用。

1

您獲得代碼重用 - 相同的源代碼和邏輯,使用不同的具體類型進行實例化,類型的組合。槓桿。

1

泛型允許您實現類型安全的例程,該類型安全的例程將支持在例程中執行的操作的任何類型。這樣,即使所有類型的處理方式與源代碼完全相同,您也不必多次定義相同的類或函數來處理不同的類型。

0

你或多或少是對的:除了非常奇怪的地方,你主要在收藏中使用它們。但是你使用收集無處不在,所以泛型是天賜之物。