2013-01-09 120 views
0

我有2個類包含將填充單獨的網格的數據。網格非常相似,但不同的要求使用2個類。這兩個網格都包含一個名爲「GetDuplicates」的函數,並且我正在實現這些類,我有一個方法用於檢查類是否有重複項,並返回一條指示如此的消息。通用方法約束?

private bool HasDuplicates(FirstGridList firstList) 
{ 
    var duplicates = firstList.FindDuplicates(); 
    if (duplicates.Count > 0) 
    { 
     // Do Something 
     return true; 
    } 
    return false; 
} 

我想能夠使用FirstGridList和SecondGridList來調用該方法。我只是不知道如何正確實現通用約束,然後將通用輸入參數轉換爲正確的類型。類似於:

private bool HasDuplicates<T>(T gridList) 
{ 
    // Somehow cast the gridList to the specific type 
    // either FirstGridList or SecondGridList 

    // Both FirstGridList and SecondGridList have a method FindDuplicates 
    // that both return a List<string> 
    var duplicates = gridList.FindDuplicates(); 
    if (duplicates.Count > 0) 
    { 
     // Do Something 
     return true; 
    } 
    return false; 
} 

正如您所看到的,該方法執行相同的操作。所以我不想這樣做兩次。我覺得這是可能的,但我錯誤地思考它。我還沒有完全體驗泛型。謝謝。

+1

'FirstGridList'和'SecondGridList'是否共享相同的基類? –

回答

7

你可以同時擁有您的網格實現共同的接口,如:

public interface IGridList 
{ 
    public IList<string> FindDuplicates(); 
} 

,然後定義泛型約束基於該接口的:

private bool HasDuplicates<T>(T gridList) where T: IGridList 
{ 
    // Both FirstGridList and SecondGridList have a method FindDuplicates 
    // that both return a List<string> 
    var duplicates = gridList.FindDuplicates(); 
    if (duplicates.Count > 0) 
    { 
     // Do Something 
     return true; 
    } 
    return false; 
} 

顯然兩者的FirstGridListSecondGridList應該實現IGridList接口和FindDuplicates方法。

,或者你可以甚至可以在這個階段擺脫仿製藥:

private bool HasDuplicates(IGridList gridList) 
{ 
    // Both FirstGridList and SecondGridList have a method FindDuplicates 
    // that both return a List<string> 
    var duplicates = gridList.FindDuplicates(); 
    if (duplicates.Count > 0) 
    { 
     // Do Something 
     return true; 
    } 
    return false; 
} 

通過在這個階段,你甚至可以擺脫HasDuplicates方法的方式,因爲它並沒有帶來多大的價值,你的應用程序。我的意思是面向對象程序設計存在很久以前的事情像泛型或LINQ,爲什麼不使用它:

IGridList gridList = ... get whatever implementation you like 
bool hasDuplicates = gridList.FindDuplicates().Count > 0; 

似乎是合理的和足夠的可閱讀與基本的C#文化任何開發。當然,它可以幫你省去幾行代碼。請記住,你寫的代碼越多,出錯的概率就越高。

+3

在這一點上,你甚至可以擺脫通用的'',只需將它直接輸入到'IGridList'。 –

+0

哦,是的,克里斯,你完全正確。我已經更新了我的回答,以包含您的評論。感謝您指出了這一點。 –

+0

@ChrisSinclair是否因爲T只在方法內部使用,並且具有接口約束?我們可以概括並說出何時使用類或接口約束,如果它用作Input,則不需要使用Generic類型? – MBen