2014-04-23 106 views
1

我正在實現一個擁有成員IEnumerable<BaseClass> Member的接口。但是我想在每個BaseClass項目中存儲一些額外的信息,爲此我創建了派生類。這是想我能夠做到:使用IEnumerable <DerivedClass>實現接口的IEnumerable <BaseClass>?

interface IImplementMe 
{ 
    IEnumerable<BaseClass> Member { get; } 
} 

class DerivedClass : BaseClass 
{ 
    // Some extra stuff here 
} 

class Implementation : IImplementMe 
{ 
    IEnumerable<DerivedClass> Member { get; } 
} 

我不認爲有辦法做到這一點(如果有的話,請讓我知道!)。 Member列表中可能有重複的項目,所以我不能使用字典來存儲額外的東西。標準,優雅的方式來達到這個目標是什麼?

+0

正因爲兩種類型,'T1'和'T2'有繼承關係,這並不意味着'摹'和'g^'(其中'G'是一個通用型的一個類型參數)具有相同的繼承關係。事實上,他們沒有繼承關係。 –

+0

接口不能有字段,屬性也有getter和setter或者只有getter? –

+0

@mikez你走了。 – Juan

回答

2

您可以使用顯式接口實現爲此的誘惑。

class Implementation : IImplementMe 
{ 
    public IEnumerable<DerivedClass> Member; 

    IEnumerable<BaseClass> IImplementMe.Member { get { return Member; } } 
} 
+0

@PatrickHofman確定這會工作,假設一個修復編譯錯誤。這是一個標準的做法。 –

+0

@ mikez:對不起,你是對的。我沒有想到演員能夠工作,但是因爲它是一個界面,所以它會起作用。 –

+0

是的!這是因爲IEnumerable是IEnumerable 不是嗎? – Juan

2

你有兩個選擇,我認爲:

  1. 使用派生類的類型參數:

    interface IImplementMe<T> where T : BaseClass 
    { 
        IEnumerable<T> Member; 
    } 
    
    class DerivedClass : BaseClass 
    { 
        // Some extra stuff here 
    } 
    
    class Implementation : IImplementMe<DerivedClass> 
    { 
        IEnumerable<DerivedClass> Member; 
    } 
    
  2. 使用IEnumerable

    interface IImplementMe 
    { 
        IEnumerable Member; 
    } 
    
    class DerivedClass : BaseClass 
    { 
        // Some extra stuff here 
    } 
    
    class Implementation : IImplementMe 
    { 
        IEnumerable Member; 
    } 
    
相關問題