4

そのため、クラス継承のあいまいさを解決する良い方法は、次のイディオムを使用することであると誰かから言われました。

class INewList<T> : IList, IList<T>
{
   new T IList<T>.this[int index] { get; set; }
}

List<T>.this構文がよくわかりません。これは、単に行うこととどのように異なりますか。

new T this[int index] { get; set; }

これら2つは機能的に異なりますか?IList<T>前の例では、後でインデクサーの実装を提供する必要がありますか、それともこのコードは単にコンパイラーに「疑わしい場合はインデクサーの実装を使用してください」と伝えているだけですか?

4

5 に答える 5

3

これは明示的な実装と呼ばれます。インターフェイスメンバーを明示的に実装すると、そのタイプ(またはサブタイプ、以下を参照)の参照を介してのみ呼び出すことができるため、IList(非ジェネリック)参照は最初の例を呼び出すことができません持ってる。

サブタイプがどのように機能するかの例を次に示します。

void Main() {
    I2 myC = new C();
    myC.Operation();
}

interface I1 {
    void Operation();
}

interface I2 : I1 {  }

class C : I2 {
    void I1.Operation() {
        Console.WriteLine ("called operation");
    }
}

これを実行すると、コンソール出力が表示されます。myCとして宣言された場合C、機能しません。

(例を追加するために更新)

于 2011-06-28T22:01:36.343 に答える
0

これは明示的なインターフェイスの実装と呼ばれ、メンバー名を共有する 2 つのインターフェイスを実装するなどの問題を回避するために使用されます。基本的に、これはオブジェクトがその特定のインターフェイスにキャストされたときにのみ呼び出すことができるメソッドです。

言う:

INewList<int> myList = new NewList<int>();
myList[1] = 2;   // Error, this[int index] is not implemented.
IList<int> myList2 = myList; // Cast as IList<int>
myList2[1] = 2;  // Succeeds, it'll call IList<T>.this[int index].
IList myList3 = myList; // Cast as IList
myList3[1] = 2;  // Error, neither this[int index] nor IList.this[int index] are not implemented.

当然、DID がいずれかを実装している場合、明示的な実装が暗黙的な実装をオーバーライドして、それぞれのメソッドを呼び出します。

于 2011-06-28T22:06:35.083 に答える
0

あなたのコード例は非常に紛らわしく、コンパイルできません。ただし、List<T>.this構文に関する質問に答えるには:

これは、明示的なインターフェイスの実装と呼ばれます。これを使用してインターフェイスを実装しますが、クラスの公開署名からは隠します。以下に小さな例を示します。

public class Foo : IDisposable {
  public void Dispose() {
  }
}

public class Bar : IDisposable {
  public void Close() {
  }
  void IDisposable.Dispose() {
    Close();
  }
}

どちらのクラスも実装しますがIDisposable、 a を破棄するBarには を呼び出す必要がありますClose。にキャストしてからIDisposable呼び出すこともできますDispose

var foo = new Foo();
foo.Dispose();

var bar = new Bar();
bar.Close();
((IDisposable) bar).Dispose();

クラスFooBar場合、 cleanup メソッドが呼び出されるDisposeかどうかは重要ではないかもしれませんがClose、クラスの場合は、代わりにそれFileを好むかもしれません。その他の用途は、オブジェクト間の相互作用に参加するために実装する必要があるインターフェイスを非表示にすることですが、クラスのコンシューマーには表示されたくない場合です。または、競合するメソッドを持つ複数のインターフェイスの実装を回避するために使用できます。CloseDispose

MSDN で明示的なインターフェイスの実装について読むことができます。

于 2011-06-28T22:07:26.120 に答える
0

これはthisの実装者としての参照ですIList<T>。そうしないと、「プレーン」の実装にあいまいさがあったため、このプロパティから
戻ることができませんでしたTILIst

于 2011-06-28T21:59:37.870 に答える
0

インターフェイスのインデクサーを明示的に実装しています。

  • 明示的な実装はInterface.XYZ構文を引き起こします
  • インデクサーの名前は ですthisので、Interface.this
于 2011-06-28T22:01:50.897 に答える