通用集合继承

时间:2012-11-10 20:13:54

标签: c# .net generics framework-design

我正在使用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在我身上耍花招?

2 个答案:

答案 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

所以,这里我们有三个继承的接口和一个实现。所有都被视为类型接口。