关于IEnumerable 是否应该继承IEnumerable(老外讨论的很多)

关于IEnumerable <T>是否应该继承IEnumerable,老外讨论的很多!

http://blogs.msdn.com/brada/archive/2005/01/18/355755.aspx
http://morganchengmo.spaces.live.com/blog/cns!9950CE918939932E!1458.entry

Should IEnumerable <T> inherits from IEnumerable?

.Net 2.0引入了Generics(泛型)的概念,原有的在System.Collectionis namespace下的接口几乎都在System.Collections.Generic namesapce下多了一个对应的Generic接口,不过奇怪的是IList <T>不是继承自IList的,而IEnumerable <T>是继承自IEnumerable的。

Brad Abrams有一篇Blog解释了为什么,但是实际上他只解释了为什么IList <T>没有继承IList。以他的观点,理想状况下,所有的新的支持Generic的 interface都应该继承以前对应的interface,但是如果让IList <T>继承IList的话,那么是实现 IList <int>的类就需要实现两个Insert方法,一个是IList <int>的void Insert(int index, int item),另外一个是IList的void Insert(int index, object item),这样对一个类对象obj,调用obj.Insert(0, 123)和调用obj.Insert(0, "abc")都是合法的,这不是我们想要的,因为我们既然继承IList <int>,就希望编译器能够做好类型检查,不让非int的物体插进来,但是这个继承关系造成了这样局面,所以IList <T>不继承IList。

上面IList <T>不应继承 IList的理由很充分,但是并不足以说明IEnumerable <T>就该继承IEnumerable。当然,因为T对 IEnumerable而言,只有“输出”作用,不像IList一样既有“输入”作用,也有“输出”作用,所以安全,但是,比较不爽的就是,每个实现 IEnumerable <T>的类,不得不实现两个GetEnumerator,MSDN的sample code并没有强调这一点,弄得很多新手(包括我:)一开始只实现了IEnumerable <T>.GetEnumerator,被编译器的出错提示搞得莫名其妙。

我觉得就不应该让IEnumerable <T>继承IEnumerable,虽然这个继承关系似乎不违反LSP,但是我觉得LSP只是一个必要条件,不是充分条件。如果谁想让一个类 既能是IEnumerable,又能是 IEnumerable <T>,那就同时实现这两个interface好了,就和IList <T>一样:

 

加一点测试用代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值