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>implements 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因为IFooextends ,因此显示它也实现和IBar​​是有意义的(否则我只会看到,并且必须导航才能看到等)FoobarIBarIBazIFooIFooIBar

于 2012-11-10T21:12:52.110 回答
-1

实际上不仅是 Visual Studio,其他工具(如 Reflector)也会显示所有接口,这些接口是按类型实现的。我认为这个功能是通过Type.GetInterfaces实现的:

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

该方法获取当前 Type实现或继承的所有接口。实现的接口是那些被声明为类型定义的一部分的接口:

public class MyClass : IList<T>

但是接口可以继承其他接口。因此,由实现的接口继承的接口是继承的接口

 public interface IList<T> : ICollection<T>

 public interface ICollection<T> : IEnumerable<T>

 public interface IEnumerable<T> : IEnumerable

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

于 2012-11-10T21:46:11.653 回答