我正在使用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在我身上扮演技巧?
如果类别Collection<T>
实现IList<T>
,则您将转到Visual Studio中的定义,它将向您显示Collection<T>
实现的所有接口。如果Collection<T>
实现了IList<T>
,它也将实现ICollection<T>
,并且因为
IList<T> : ICollection<T>
和
ICollection<T> : IEnumerable<T>
等。
在其他单词中,如果我写
interface IFoo : IBar, IBaz {}
interface IBar {}
interface IBaz {}
class Foobar : IFoo {}
然后,Visual Studio会给我:
Foobar : IFoo, IBar, IBaz {...} (from metadata).
如果我实现了IFoo
,我还必须实现IBar
,因为IFoo
扩展了IBar
,因此表明Foobar
还实现IBar
和IBaz
是很有意义的(否则我只看到IFoo
,并且必须导航到IFoo
才能看到IBar
等等)
实际上不仅是Visual Studio,而且其他工具(例如Reflector)也将显示所有通过类型实现的接口。我认为此功能是通过type.getinterfaces实现的:
Type type = typeof(MyClass);
Type[] interfaces = type.GetInterfaces();
此方法获取所有 interfaces 通过当前类型实现或继承。实现的接口是那些,被称为类型定义的一部分:
public class MyClass : IList<T>
但是接口可以继承其他接口。因此,通过实现的接口继承的接口是继承的接口:
public interface IList<T> : ICollection<T>
public interface ICollection<T> : IEnumerable<T>
public interface IEnumerable<T> : IEnumerable
因此,在这里我们有三个继承的接口,一个实现。所有这些都被视为类型接口。