接口继承的声明问题
Written by Allen Lee
某天,小新问我这样一个问题:
类System.Collections.CollectionBase是从IList、ICollection继承而来,IList是从ICollection和IEnumerable继承而来,那CollectionBase为什么还要从ICollection继承呢?
我们先来看看这些类和接口在MSDN文档中的声明:
public interface IEnumerable

public interface ICollection : IEnumerable

public interface IList : ICollection, IEnumerable

public abstract class CollectionBase : IList, ICollection, IEnumerable
根据接口继承的规则,我们知道CollectionBase只需要声明实现IList,就必须同时实现ICollection,也就必须实现IEnumerable,那么,我们为什么还要明确地把所有的这些接口都写下来呢?
换句话说,下面两种声明没有实质的区别:
// Code #1

public interface IEnumerable

public interface ICollection : IEnumerable

public interface IList : ICollection, IEnumerable

public class ArrayList : IList, ICollection, IEnumerable, ICloneable
// Code #2

public interface IEnumerable

public interface ICollection : IEnumerable

public interface IList : ICollection

public class ArrayList : IList, ICloneable
那为何MSDN要使用上面那种呢?我和小新讨论后,一致认为这样做仅仅为了提高代码的可读性。为了验证我们的想法,我分别发邮件给Eric Gunnerson(Eric是C# Compiler Team的成员)和Kit George(Kit是BCL Team的成员)询问这个问题,他们的回信如下:
| Allen,
I think that readability would be the primary reason people would do this.
Eric |
今天,我查看微软的Rotor源代码,发现ArrayList的声明的确是Code #1的做法,不过Mono(ver. 1.1.2 Development Version)就采用了Code #2的做法。
所以,以后如果你再碰到到这样的情况,你可以轻松的笑一声:“这样做是为了提高代码的可读性的!”
posted @ 2004-11-16 14:21
Allen Lee 阅读(2740)
评论(8) 编辑 收藏 所属分类:
C#