我正在使用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在我身上耍花招?
答案 0 :(得分:6)
如果一个类,比如说Collection<T>
实现了IList<T>
,那么你将转到Visual Studio中的定义,它将显示Collection<T>
实现的所有接口。如果Collection<T>
实现IList<T>
,它还会实现ICollection<T>
和IEnumerable,因为
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
1}}和IBaz
(否则我只会看到IFoo
,并且必须导航到IFoo
以查看IBar
等。)
答案 1 :(得分:-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
所以,这里我们有三个继承的接口和一个实现。所有都被视为类型接口。