通用收集继承



我正在使用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还实现IBarIBaz是很有意义的(否则我只看到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

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

相关内容

  • 没有找到相关文章

最新更新