1

コードなどにいくつかのインターフェイスを実装する必要があることがよくありIEnumerable<T>ます。

毎回、自動的に実装するときに、次のことが発生します。

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

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

両方のGetEnumerator()メソッドを実装する必要がありますが、どうにかして同じことを行うことがわかっていても、同じ名前を持つことは不可能です。コンパイラは、戻り値の型のみが異なるため、一方を他方のオーバーロードとして扱うことができません。

そうするとき、GetEnumerator1()アクセサをに設定することができprivateます。このように、コンパイラはインターフェイス メンバーを実装していないことについて文句を言うことはありませんNotImplementedException。メソッドの本体内で a をスローするだけです。

しかし、それは良い習慣なのか、それとも別の方法で進めるべきなのか、おそらくメソッド エイリアスか何かではないかと思います。

IEnumerable<T>同じ名前の2つの異なるメソッドの実装を必要とするようなインターフェースを実装する際の最良のアプローチは何ですか?

編集#1

VB.NET はインターフェイスを実装する際に C# とは異なる反応を示しますか?VB.NET では明示的に実装されているため、GetEnumerator1(). コードは次のとおりです。

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()メソッドも明示的に実装されており、コンパイルはそれらが同じ名前を持つことを拒否します。なんで?

4

4 に答える 4

6

明示的なインターフェース実装を使用できます:

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

public IEnumerator<T> GetEnumerator()
{
    ...
}
于 2010-06-01T19:37:49.437 に答える
3

Visual Basicでは、すべてのインターフェイスの実装は明示的です。

インターフェイスマッピングはImplementsステートメントによって定義されるため、インターフェイス実装メソッドに任意の名前を付けることができます。(コンパイラが名前と署名を照合することによってインターフェイスを実装するメソッドを推測するC#とは異なります。)

メソッド名と可視性を(必要に応じて)変更することは、VBの標準的な方法です。概要については、VB.NETでのインターフェイスの実装を参照してください。

于 2010-06-01T19:39:09.090 に答える
1

明示的なインターフェイスの実装を使用して、同じ署名を持つ 2 つのメソッドを作成できるはずです。列挙する内容に応じて、これらの呼び出しをIEnumerable<T>リストや配列などの内部に渡すだけです。

于 2010-06-01T19:38:32.960 に答える
0

非ジェネリックインターフェイスを明示的に実装すると、両方のメソッドに同じ名前を付けることができ、非ジェネリックバージョンをジェネリックバージョンで実装できます。の線に沿って:

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

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}
于 2010-06-01T19:40:28.387 に答える