2011-01-30 12 views
11

継承はC#で推移的な関係ですか?C#:推移的継承

すでに私のためにこれを明確にするためのIEnumerable<T>

感謝を実装ICollection<T>としてIList<T>ICollection<T>IEnumerable<T>を実装して、なぜ私が理解できないので、私は求めています。

+0

あなたはこれと同様の[質問]でいくつかの答えを見つけることができます[1] [1]:http://stackoverflow.com/questions/1164757/why-arraylist-implement-ilist-icollection-ienumerable – DesignFirst

+0

http://stackoverflow.com/questions/4754923/a-question-about-interface-inheritance-in-net/4755044#4755044 – explorer

+0

これはhttp://stackoverflow.com/questions/4817369/whyの複製です。本当にリストアするのはインターフェイスだけではなく、唯一のilistt/4818566#4818566 –

答えて

4

私の知る限りでは、本当にあなたにIList<T>宣言かどうかは関係ありません:

public interface IList<T> : ICollection<T>, IEnumerable<T> { ... } 

かを単に:

public interface IList<T> : ICollection<T> { ... } 

実装する必要がありますIList<T>を実装したい任意のクラスすべてこれらのインタフェースのうち、継承されたものも同様です。

IEnumerable/IEnumerable<T>インターフェイスのGetEnumeratorメソッドを実装せずにこのインターフェイスを実装すると、明らかにコンパイラエラーが発生します。実証によるこの「証拠」は、「インタフェースの継承」が実際に推移的であることを伝えるのに十分なはずです。


追記サイドノート1.(とややオフトピック)、あなたはまた、次の操作を行うことができ考える:

class Base 
{ 
    public void Foo() { ... } 
} 

interface IFoo 
{ 
    void Foo(); 
} 

class Derived : Base, IFoo 
{ } 

Derivedが実際にIFooを実装していません。その基本クラスBaseはメソッドFooを提供しますが、それ自体はIFooを明示的に実装していません。

インターフェイスで必要なすべてのメソッドがあるため、これはうまくコンパイルされます。 (私はそれを残し、現時点では正確な技術的な話を残しておきます)

私がこの一見無関係の現象を言及しているのは、私がこのようにインタフェース継承を考えたからです。クラス宣言で指定されたインタフェースで必要なすべてのメソッドを実装します。だから私は、代わりに言っての

interface ICollection<T> : IEnumerable<T> { ... } 

を見るとICollection<T>IEnumerable<T>を継承」、私は自分自身に、は「ICollection<T>が、彼らはまた、IEnumerable<T>を実装するすべての実装クラスで必要です。」と言うことができます


追記2。もう一度やや関連した逸話でこの答えを結論づけてください(私はそれが最後のものになると約束します):

しばらく前に私はビデオを見ました:Inside .NET Rx and IObservable/IObserver in the BCLチャンネル9。 RxからBCLに.NET 4が導入されました.1つの特有のことは、オブザーバをobservable.Subscribe(observer)でオブザーバブルに登録すると、匿名で返されるのは匿名のIDisposableです。どうして?

話者がそのビデオで説明したように、それらのように定義された型名「別名」を介して、IDisposableより説明的な名前(例えばISubscription)を与えている可能性があり、次のとおりです。

interface ISubscription : IDisposable {} 

をしかし、彼らは最終的にこれに対して決定しました。彼らは、ISubscriptionSubscribeメソッドから返されると、戻り値がDipose dである必要があることはもはや分かりません。

これはもう1つ注意が必要な「インターフェース継承」のやや問題のある側面です。

8

すべての点で推移的です。おそらく、継承階層を見るために使用するツールには、それを表示する特定の方法があります。インターフェイスを実装する方法はありませんが、明示的に実装してintellisenseから隠すことはできます。

IListの作成者は、ICollectionまたはICollectionとIEnumerableから自由に派生することができます。 IEnumerableはこの場合重複し、resharperによってフラグが立てられます。

+0

中断して申し訳ありませんが、「resharperによってフラグが立てられました」が私の注目を集めました。 Resharperは単なるツールであり、プログラミングの教祖ではありません。また、変更された場合、後でトラブルを引き起こす多くの他の事柄にフラグを立てます。 (例:明示的宣言を暗黙的(var)に変更するフラグ) – kubal5003

+0

はい。私は、resharperをプログラミングしている人々が私に同意しているという社会的証拠を与える文章を意味していました。 – usr