2016-04-21 51 views
0

我有兩個接口,其中一個具有泛型類型。但是當我嘗試使用它們時,我不能。從兩個分層接口繼承?

第一接口是:

interface IGene 
{ 
    string Name { get; set; } 
    int Index { get; set; } 
} 

二是:

interface IChromosome<X> where X :IGene 
{ 
    double Fitness { get; } 
    X[] Genes { get; set; } 
} 

的類來實現這些:

class GAMachine<T> where T : IChromosome<X> where X:IGene 
{ 
    //...... 
} 

在最後一個碼它給出了一個錯誤。我怎樣才能寫出這個等級秩序?任何選擇?

+2

你什麼錯誤? –

+0

'無法找到類型或名稱空間名稱「X」,它表示 –

回答

3

這是因爲您沒有在泛型定義中的類定義中定義X.我認爲你在追求的是這個。

class GAMachine<T> where T : IChromosome<IGene> 
{ 
    //.... 
} 

或者這

class GAMachine<T, X> where T : IChromosome<X> where X : IGene 
{ 
    //.... 
} 
+0

對於您的第一個解決方案,我有一個新問題。如果我使用''來比較兩個IGene實例,會發生問題嗎?我的代碼使用比較和類用戶能夠爲實現的'X'類編寫不同的比較方法。那麼如果使用'',我可以比較兩個相同類型的變量嗎?因爲如果我沒有錯,我知道接口不能包含比較方法,只是從它繼承的類可以。 –

+1

@AliTor - 它不應該,但它取決於你的實現。理想情況下,您應該在要進行比較的具體類型上重寫Equals和GetHashCode。您也可以在具體類型上實現泛型IEquals 以執行比較。然後,當您真正比較實例時,具體的等式實現應該接管。但這取決於你如何實施你的比較,所以我不能肯定地說。 – Igor

+0

正如我所理解的,我應該創建一個包含「Equals」方法的額外'IEquals '。我需要用戶添加一個方法來檢查相等性,這種方式足以強制用戶向繼承類添加一個相等方法,不是嗎? –