複製メンバー名を必要とするインターフェイスを実装する方法は?
-
22-10-2019 - |
質問
私はしばしば、ようないくつかのインターフェイスを実装する必要があります IEnumerable<T>
私のコードで。
毎回、自動的に実装するとき、私は次のことに遭遇します。
public IEnumerator<T> GetEnumerator() {
// Code here...
}
public IEnumerator GetEnumerator1() {
// Code here...
}
私は両方を実装する必要がありますが getEnumerator() 方法は、たとえ同じことをしていると理解していても、信じられないほど同じ名前を持つことができます。コンパイラは、リターンタイプのみが異なるため、一方を他方の過負荷であると扱うことはできません。
そうするとき、私はなんとか設定します GetEnumerator1()
のアクセター private
. 。このように、コンパイラはインターフェイスメンバーを実装しないという苦情はありません。 NotImplementedException
メソッドの本体内。
しかし、それが良い習慣なのか、それとも私が別の方法で進むのか、おそらくメソッドのエイリアスなどのようなものであるのだろうか。
などのインターフェイスを実装する際の最良のアプローチは何ですか
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()
方法は明示的に実装されており、コンパイルは同じ名前を持つことを拒否します。なんで?
解決
ビジュアルベーシックでは、 すべてのインターフェイスの実装は明示的です.
インターフェイスマッピングは、 Implements
ステートメントでは、インターフェイスの実装メソッドに名前を付けることができます。 (C#とは異なり、コンパイラが名前と署名を一致させてインターフェイスを実装するメソッドを推進します。)
メソッド名と可視性を(必要に応じて)変更することは、VBの標準的な慣行です。見る VB.NETでインターフェイスを実装します 良い概要については。
他のヒント
使用できます 明示的なインターフェイスの実装:
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public IEnumerator<T> GetEnumerator()
{
...
}
使用できるはずです 明示的なインターフェイスの実装 同じ署名を持つ2つのメソッドを作成します。あなたが列挙しているものに応じて、私はこれらの呼び出しを内部に渡すだけです IEnumerable<T>
リストや配列など。
非遺伝子インターフェイスを実装することにより、両方の方法が同じ名前を持つことができ、ジェネリックバージョンの一般的なバージョンの観点から実装されます。の線に沿って:
public class TestEnumerable : IEnumerable<int>
{
public IEnumerator<int> GetEnumerator()
{
// Type-safe implementation here.
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}