継承はC#で推移的な関係ですか?C#:推移的継承
すでに私のためにこれを明確にするためのIEnumerable<T>
感謝を実装ICollection<T>
としてIList<T>
がICollection<T>
とIEnumerable<T>
を実装して、なぜ私が理解できないので、私は求めています。
継承はC#で推移的な関係ですか?C#:推移的継承
すでに私のためにこれを明確にするためのIEnumerable<T>
感謝を実装ICollection<T>
としてIList<T>
がICollection<T>
とIEnumerable<T>
を実装して、なぜ私が理解できないので、私は求めています。
私の知る限りでは、本当にあなたに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 {}
をしかし、彼らは最終的にこれに対して決定しました。彼らは、ISubscription
がSubscribe
メソッドから返されると、戻り値がDipose
dである必要があることはもはや分かりません。
これはもう1つ注意が必要な「インターフェース継承」のやや問題のある側面です。
すべての点で推移的です。おそらく、継承階層を見るために使用するツールには、それを表示する特定の方法があります。インターフェイスを実装する方法はありませんが、明示的に実装してintellisenseから隠すことはできます。
IListの作成者は、ICollectionまたはICollectionとIEnumerableから自由に派生することができます。 IEnumerableはこの場合重複し、resharperによってフラグが立てられます。
あなたはこれと同様の[質問]でいくつかの答えを見つけることができます[1] [1]:http://stackoverflow.com/questions/1164757/why-arraylist-implement-ilist-icollection-ienumerable – DesignFirst
http://stackoverflow.com/questions/4754923/a-question-about-interface-inheritance-in-net/4755044#4755044 – explorer
これはhttp://stackoverflow.com/questions/4817369/whyの複製です。本当にリストアするのはインターフェイスだけではなく、唯一のilistt/4818566#4818566 –