为什么ICollection已经是继承于IEnumerable的了,IList 还要从 ICollection, IEnumerable 继承?

麻子 2015-12-10 04:56:43
IList : ICollection 不就都包含了吗 ?
...全文
232 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
这里可以强化这样的概念:.net framework跟c#、vb.net,是不一样的,这中差别是历史和系统进化的必然,在描述编程问题中不要混乱地使用它们。
  • 打赏
  • 举报
回复
换成一个“定理式”的语言来说吧: .net 中的接口并不支持继承,但是c#语言中的接口支持继承。靠的是c#编译器的语法糖。
  • 打赏
  • 举报
回复
#3楼的说明是对的。我换个角度再来举一个例子: 比如说你可以写代码
public interface XEnumerable
{
    void enm();
}

public interface XCollection: XEnumerable
{
    void a();
}

public interface XList: XCollection
{

}

public class A : XList
{
    public void a()
    {
        throw new NotImplementedException();
    }

    public void enm()
    {
        throw new NotImplementedException();
    }
}
如果你编译之后,调用
XList x = new A();
x.enm();
就会发现完全可以编译和执行。但是看看编译之后的dll结果,你会发现实际上编译出来的代码是
public interface XList : XCollection, XEnumerable
{
}
也就是说,c#语言的“语法糖”给你混沌了这里的代码问题,补齐了这里在XList 接口定义上的问题。 从理论上解释,实际上接口是不支持继承的。也就是说,如果 IList不实现 IEnumerable,那么它就没有这个接口。这跟class支持继承是完全不同的。 class支持继承,而Interface并不支持继承。但是c#语言的编译器给你用障眼法,帮你补上了自定义Interface代码中的漏洞。
Lamuna 2015-12-10
  • 打赏
  • 举报
回复
抽象成员必须有内容……说白了假设有一个孩子是C,这个孩子继承了父亲(A)和母亲(B)的一些特性,那你应该不光知道哪些谁他自己的特性,还要知道他爸妈的特性才可以,否则你不验证他父母的特性,结果发现C其实是父亲和 D的私生子……那岂不是以后会很麻烦? C#在这里处理的比较严苛,相当于“证明C妈是C妈,且C爸是C爸”的这个过程,你要有父亲(A)的信息,也要有母亲(B)的信息,否则不通过审批,不承认C的户籍——他就不能被处理了……
crystal_lz 2015-12-10
  • 打赏
  • 举报
回复
引用 3 楼 shingoscar 的回复:
那是因为你用的反编译工具看dll才会出现这个问题
真正的源代码根本就没写这么多

貌似我电脑有装 .NetReflector
Poopaye 2015-12-10
  • 打赏
  • 举报
回复
那是因为你用的反编译工具看dll才会出现这个问题
真正的源代码根本就没写这么多

crystal_lz 2015-12-10
  • 打赏
  • 举报
回复
记得前段时间 也有人问这个问题来着 找了一下 不知道帖子到哪里去了。。 如果只写IList 那么 你就只知道 有一个接口IList 而不知道 IList 又是从哪里来的。。
xdashewan 2015-12-10
  • 打赏
  • 举报
回复
为了让你看的更加明白,更为清楚需要实现哪些功能
这一节我们来学习集合,什么是集合呢? 集合就如同数组,用来存储和管理一组特定类型的数据对象,除了基本的数据处理功能,集合直接提供了各种数据结构及算法的实现,如队列、链表、排序等,可以让你轻易地完成复杂的数据操作。在使用数组和集合时要先加入system.collections命名空间,它提供了支持各种类型集合的接口及类。集合本身上也是一种类型,基本上可以将其作为用来存储一组数据对象的容器,由于c#面向对象的特性,管理数据对象的集合同样被实现成为对象,而存储在集合中的数据对象则被称为集合元素。这里提到了接口这个概念,它也是面向对象编程进化的重要标准,我们在这里不做过多的讲解,先注重学习集合中的对象及其使用就可以了,下面我们来学习第一种集合: 动态数组ArrayList.ArrayList类提供了继承了IList接口。什么是继承呢?这也是面向对象语言的重要特点之一,现在你们先把它理解为,如果一个对象继承了类或接口,那么它也具有了这个类和接口中的方法、属性,可以用这些继承的方法和属性来做相应的操作,比如:数组增加元素没有Add()方法,但是动态数组ArrayList继承了一个增加元素有Add()方法的接口,那么当它要增加元素的时候,不仅可以用索引,也可以用继承下来的Add()方法了。随着学习的深入,我会给大家再具体讲解继承的概念和使用继承的好处。那么下面让我们来看看动态数组所继承的这个接口IList它有什么特性呢? Ilist接口:定义了利用索引访问集合对象的方法,还继承了ICollectionIEnumerable接口,除实现了接口原有的方法成员外,其本身也定义多个专门的方法成员,例如新增、移除、在指定位置插入元素或是返回特定元素在集合中所在的位置索引,这些方法主要为集合对象提供类似数组的元素访问功能。 ILsit接口成员:add、insert、RemoveAt、Remove、contains、Clear、indexof方法,它最大的特色在于提供类似数组索引的访问机制。 ArrayList对象是较为复杂的数组。我们可以将它看为扩充了功能的数组,但ArrayList并不等同于数组,与数组相比,它以下功能和区别是: 1. 数组的容量是固定的,但ArrayList的容量可以根据需要自动扩充。当我们修改了ArrayList的容量时,则可以自动进行内存重新分配和元素复制,比如往1号索引位插入n个元素,插入后,元素的索引依次向后n个位置排列,它是动态版本的数组类型。 2.ArrayList提供添加、插入或移除某一范围元素的方法。但是在数组中,只能一次获取或设置一个元素的

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧