接口继承的声明问题 [C#, BCL]

接口继承的声明问题

 

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

Allen, what you’re seeing is simply a doc thing. ArrayList actually only implements IList directly, but we decided in V1.0 of the docs, to highlight the interface hierarchy so you didn’t have to wonder ‘what does IList implement’, you get to see it there on the type.

There is no benefit to ACTUALLY doing this. Try this code, and you’ll see it compiles:

using  System;
using  System.IO;

public   class  Test : IBob2
{
    
void IBob.M() {}
}


interface  IBob
{
    
void M();
}


interface  IBob2 : IBob  {}

Regards,

Kit

今天,我查看微软的Rotor源代码,发现ArrayList的声明的确是Code #1的做法,不过Mono(ver. 1.1.2 Development Version)就采用了Code #2的做法。

所以,以后如果你再碰到到这样的情况,你可以轻松的笑一声:“这样做是为了提高代码的可读性的!”

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值