2009-08-11 54 views
2

我不確定我想要做什麼甚至是一個好主意,但無論如何,這是問題:我有MyClass,我想實現兩種不同類型的通用IEnumerable類,例如C#實現兩個不同的通用接口

public class MyClass : IEnumerable<KeyValuePair<string, string>>, 
         IEnumerable<KeyValuePair<MyEnum, string>> 

現在,這樣做的問題是,當我嘗試定義從接口必要的方法,編譯器會抱怨「類型‘MyClass的’已經定義了一個名爲‘的GetEnumerator’具有相同參數類型的成員」。這是因爲我有這兩種方法:

public IEnumerator<KeyValuePair<MyEnum, string>> GetEnumerator() { ... } 
public IEnumerator<KeyValuePair<string, string>> GetEnumerator() { ... } 

我必須GetEnumerator()不帶參數,因爲接口的,而不同的僅僅是返回類型,這是不允許的。

這裏是我所看到的是我的選擇:

  1. 我正在考慮有一個「主」 IEnumerable通用其中MyClass將執行,然後就補充說,通過參數的不同,而不僅僅是返回類型額外的方法類型(例如Add),而不實現額外的通用接口。
  2. 我可以爲MyClass創建一個通用基類,將其稱爲MyBaseClass<T>,它將實現IEnumerable<KeyValuePair<T, string>>。然後,我會有MyClass的不同版本,例如MyClass<string>MyClass<MyEnum>

在這裏看起來更可取,或者我錯過了一個更好的解決方案?

+0

您不能繼承接口(或更多接口)。 – 2009-08-11 22:21:13

+0

@Arnis:你什麼意思? – scwagner 2009-08-11 22:26:25

+0

http://msdn.microsoft.com/en-us/library/ms973861.aspx – 2009-08-11 22:27:02

回答

14

您可以使用顯式接口聲明來獲得您實現的兩個接口中的每一個接口的不同實現。例如:

public class MyClass : IEnumerable<KeyValuePair<string, string>>, 
        IEnumerable<KeyValuePair<MyEnum, string>> 
{ 
    IEnumerator<KeyValuePair<MyEnum, string>> IEnumerable<KeyValuePair<MyEnum, string>>.GetEnumerator() 
    { 
     // return your enumerator here 
    } 

    IEnumerator<KeyValuePair<string, string>> IEnumerable<KeyValuePair<string, string>>.GetEnumerator() 
    { 
     // return your enumerator here 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     var me = this as IEnumerable<KeyValuePair<string, string>>; 
     return me.GetEnumerator(); 
    } 
} 

然而,由於IEnumerable的<自IEnumerable>派生,你必須選擇你想要從IEnumerable.GetEnumerator()的調用返回哪一個。

2

您可以明確地實現這樣的每個接口:

IEnumerable<KeyValuePair<string, string>> IEnumerable<KeyValuePair<string, string>>.GetEnumerator() { ... } 
IEnumerator<KeyValuePair<MyEnum, string>> IEnumerator<KeyValuePair<MyEnum, string>>.GetEnumerator() { ... } 
2

您可以使用explicit interface implementation實現與衝突的方法接口。但是,如果你實現了兩個接口IEnumerable<T>,它會導致一些令人討厭的問題,如foreach循環。我曾經爲此嘗試過,並立即回到實現1 IEnumerable接口,並提供另一個作爲對象的屬性。

+1

5分鐘內回答有關顯式界面的問題。:D – 2009-08-11 22:24:41

+0

是的,但只有我提供了一個改進的解決方案:deal::) – 2009-08-11 22:26:43

+0

我不會參加「誰會改善他的回答更好」的比賽。 :) – 2009-08-11 22:29:04