2

私はMVVMでWPFアプリを構築しており、ObservableCollectionを使用しています。ViewModel で作業しているときに、ObservableCollection の型定義を調べることにしましたが、奇妙なことに気付きました。

// class definition for ObservableCollection
ObservableCollection<T> : Collection<T>, INotifyCollectionChanged, INotifyPropertyChanged
// derives from Collection<T>
... 
// class definition for Collection<T>
Collection<T> : IList<T>, ICollection<T>, IEnumerable<T> ... (as well as non-generics)

さて、ここで質問です:

If ICollection<T> implements IEnumerable<T> 
AND 
IList<T> implements ICollection<T> AS WELL AS IEnumerable<T>
...
...
Why does Collection<T> implement ALL THREE?

これは本当にどのように実装されているのですか、それともこの VS2010 が私にいたずらをしているのですか?

4

2 に答える 2

6

クラス、たとえばCollection<T>実装IList<T>し、Visual Studioの定義に移動すると、実装するすべてのインターフェイスが表示Collection<T>されます。Collection<T>を実装する場合は、IEnumerableIList<T>も実装します。ICollection<T>

IList<T> : ICollection<T>

ICollection<T> : IEnumerable<T>

言い換えれば、私が書くなら

interface IFoo : IBar, IBaz {}
interface IBar {}
interface IBaz {}

class Foobar : IFoo {}

次に、VisualStudioから次の情報が提供されます。

Foobar : IFoo, IBar, IBaz {...} (from metadata).

を実装する場合は、extendsIFooも実装する必要があります。したがって、それも実装することを示すのは理にかなっています(そうでない場合は、が表示されるだけで、移動して表示する必要があります)。IBarIFooIBarFoobarIBarIBazIFooIFooIBar

于 2012-11-10T21:12:52.110 に答える
-1

実際には、Visual Studio だけでなく、他のツール (Reflector など) にも、型ごとに実装されているすべてのインターフェイスが表示されます。この機能はType.GetInterfaces経由で実装されていると思います:

Type type = typeof(MyClass);
Type[] interfaces = type.GetInterfaces();

このメソッドは、現在の Type によって実装または継承されたすべてのインターフェイスを取得します。実装されたインターフェイスは、Type の定義の一部として宣言されているものです。

public class MyClass : IList<T>

ただし、インターフェイスは他のインターフェイスを継承できます。したがって、実装されたインターフェースによって継承されるインターフェースは、継承されたインターフェースです。

 public interface IList<T> : ICollection<T>

 public interface ICollection<T> : IEnumerable<T>

 public interface IEnumerable<T> : IEnumerable

したがって、ここでは 3 つの継承されたインターフェイスと 1 つの実装されたインターフェイスがあります。すべてが型インターフェイスと見なされます。

于 2012-11-10T21:46:11.653 に答える