2010-06-01 43 views
1

我經常需要在代碼中實現一些接口,如IEnumerable<T>如何實現需要重複成員名稱的接口?

每一次,自動執行的時候,我遇到以下:

public IEnumerator<T> GetEnumerator() { 
    // Code here... 
} 

public IEnumerator GetEnumerator1() { 
    // Code here... 
} 

雖然我必須實現兩個GetEnumerator()方法,他們不可能可以具有相同的名稱,即使我們明白,他們這樣做,不知何故。編譯器不能將它們視爲另一個的重載,因爲只有返回類型不同。

在這樣做時,我管理的GetEnumerator1()訪問設置爲private。這樣,編譯器不會抱怨沒有實現接口成員,我只是在方法的主體內拋出一個NotImplementedException

不過,我不知道它是否是一個很好的做法,或者如果我將着手有所不同,作爲可能的方法別名或像這樣的東西。

什麼是最好的方法,而實現一個接口,如IEnumerable<T>需要實現兩個不同的方法具有相同的名稱?

編輯#1

是否VB.NET,同時實現接口,因爲在VB.NET它明確地實現,從而迫使GetEnumerator1()不同於C#反應。下面的代碼:

Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of T) Implements System.Collections.Generic.IEnumerable(Of T).GetEnumerator 
    // Code here... 
End Function 

Public Function GetEnumerator1() As System.Collections.Generic.IEnumerator Implements System.Collections.Generic.IEnumerable.GetEnumerator 
    // Code here... 
End Function 

兩個GetEnumerator()方法都明確地實施,編譯將拒絕他們具有相同的名稱。爲什麼?

+0

這將不會編譯。 – SLaks 2010-06-01 19:40:08

+0

嗯,這裏並不重要,因爲它是陳述我想說的話的一個例子。請參閱我的問題編輯。 =) – 2010-06-01 19:53:00

+0

你的VB方法聲明顯式地實現*不同*接口(泛型和非IEnumerator的泛型版本):你是否說編譯器不允許這些? – 2010-06-01 19:58:12

回答

3

在Visual Basic,所有的接口實現是明確

接口映射由Implements語句定義,所以你可以命名任何你想要你的接口實現方法。 (不同於C#,其中所述編譯器推斷哪些方法通過匹配它們的名稱和簽名實現接口。)

改變方法名和可視性(適當時)是在VB的標準做法。請參閱Implementing Interfaces in VB.NET以獲得良好的概述。

+0

請我的問題編輯。 – 2010-06-01 19:49:42

+0

我同意,但即使如此,如果我將'GetEnumerator1()'重命名爲'GetEnumerator()',編譯器仍然抱怨,因爲它已經有一個名爲'GetEnumerator()'的方法。在這種情況下,.NET最喜歡的最佳解決方案/方法是什麼?謝謝! =) – 2010-06-01 19:59:08

6

您可以使用explicit interface implementation

IEnumerator IEnumerable.GetEnumerator() 
{ 
    return GetEnumerator(); 
} 

public IEnumerator<T> GetEnumerator() 
{ 
    ... 
} 
+0

請我的問題編輯。 – 2010-06-01 19:48:15

1

你應該能夠使用Explicit Interface Implementations創建具有相同簽名的兩種方法。根據您列舉的內容,我只需將這些調用傳遞給內部的IEnumerable<T>,如List或數組。

+0

請我的問題編輯。 – 2010-06-01 19:48:51

0

實現非泛型接口明確允許這兩種方法具有相同的名稱,並允許在通用一個方面要實現的非通用版本。沿線:

public class TestEnumerable : IEnumerable<int> 
{ 
    public IEnumerator<int> GetEnumerator() 
    { 
     // Type-safe implementation here. 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 
+0

請我的問題編輯。 – 2010-06-01 19:50:07

相關問題