请问既然Ilist已经继承了ICollection,为何CollectionBase类仍然要同时继承这2个接口?

lryfrank 2006-02-07 08:27:01
请问既然Ilist已经继承了ICollection,为何CollectionBase类仍然要同时继承这2个接口?这样做有什么意义?是否多此一举?
...全文
355 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
lryfrank 2006-02-10
  • 打赏
  • 举报
回复
???

汗,都瞎说, ivony 你的解释也是不对的

不是吧
Ivony 2006-02-08
  • 打赏
  • 举报
回复
给链接……
lryfrank 2006-02-08
  • 打赏
  • 举报
回复
哦。好的。谢谢这位朋友。

结贴了。。。

请问你了解CollectionBase的LIST属性吗?我的另外一个帖子没人回。可以帮我解答一下吗?谢谢了
Ivony 2006-02-08
  • 打赏
  • 举报
回复
哪为什么要collectionbase要把这些接口都写出来呢?是为了表达清楚?


似乎除了这个没有更合理的解释了……
Ivony 2006-02-08
  • 打赏
  • 举报
回复
如果MyClass1也采用显示接口实现,又会怎样?
实际上在这里一个接口方法可以被实现四次。

MyClass1中的实现接口和显示接口实现。
MyClass2中的再次实现接口(C#2.0支持)和显示接口实现。

规律到底如何?
lryfrank 2006-02-08
  • 打赏
  • 举报
回复
==我还想问一下。。

哪为什么要collectionbase要把这些接口都写出来呢?是为了表达清楚?
Ivony 2006-02-08
  • 打赏
  • 举报
回复
其实接口有另一个值得研究的问题,就是重复接口实现。

考虑这个问题:

有接口IMyInterface
MyClass1这个类实现了接口IMyInterface。
MyClass2继承于MyClass1,也就同时实现了IMyInterface,但是,这个时候MyClass2仍然可以再次实现IMyInterface(利用显示接口实现),这里就是重复接口实现了。

楼主不妨试试,
这个时候。
生成一个MyClass2的对象,放在类型为MyClass1的变量里。
再强制类型转换为IMyInterface,执行一个方法,
这个时候执行的方法是MyClass1中的实现还是MyClass2中的显示接口实现。
tiaoci 2006-02-08
  • 打赏
  • 举报
回复
汗,都瞎说, ivony 你的解释也是不对的
涛声宜旧 2006-02-08
  • 打赏
  • 举报
回复
接口主要用来把功能性的内容定义,其它类中实现,以便于不同的类有相同的方法,但执行结果却不同
lryfrank 2006-02-08
  • 打赏
  • 举报
回复
你说的4种接口实现方式我有点疑问,你说的MyClass1也采用显示接口实现是什么意思?本来Myclass11就是显示接口实现啊,Myclass2倒是可以实现2次接口。Myclass1如何实现2次?

代码:

using System;

public interface Imy
{
void test();
}

class Myclass1:Imy
{
public virtual void test()
{
Console.WriteLine("This is Myclass1 1#");
}
}

class Myclass2:Myclass1,Imy
{
public override void test()
{
Console.WriteLine("This is Myclass2 1#");
}
}

class Demo
{
public static void Main()
{
//Myclass1 a=new Myclass1();
Myclass2 a=new Myclass2();
Myclass1 b=a;
Imy c=(Imy)b;
c.test();
Console.Read();
}
}


如何实现4次?可以府上你的代码吗?
lryfrank 2006-02-08
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/TopicView3.asp?id=4544148
Ivony 2006-02-07
  • 打赏
  • 举报
回复
对,自己亲手试验一下就什么都清楚了……
lryfrank 2006-02-07
  • 打赏
  • 举报
回复
哦对。实例过了。证明接口可以继承

using System;

public interface A{
void meth1();
void meth2();
}

public interface B{
void meth3();
}

class Myclass:B{
public void meth1(){
Console.WriteLine(".....");
}

public void meth2(){
Console.WriteLine("....");
}

public void meth3(){
Console.WriteLine("....");
}

}

class C{
public static void Main(){
Myclass ob = new Myclass();

ob.meth1();
ob.meth2();
ob.meth3();
}
}

删除了Myclass的meth1或者meth2.会错误!!!!!



普及一下知识啦:

接口根本没有什么继承概念。如果接口IB实现了接口IA,接口IC实现了接口IB,并不能说接口IC实现了IA。接口与继承不同,不具有传递性。接口仅仅是个很弱的定义功能,不能和继承同日而语,差很多很多功能,不能因为继承也可以规范接口定义就以为接口和继承很像。



你普及一下知识。。呵呵
lryfrank 2006-02-07
  • 打赏
  • 举报
回复
??你是指得那个楼上的说的是错的?
Ivony 2006-02-07
  • 打赏
  • 举报
回复
楼上的说的是错的。甚至可以说是胡说八道。

事实上,的确如你所说,后面的ICollection和IEnumerable是废话,不写是一样的。
lryfrank 2006-02-07
  • 打赏
  • 举报
回复
谢谢!
  • 打赏
  • 举报
回复
public interface ICollection : IEnumerable

public interface ICollection : IEnumerable

public interface IList : ICollection, IEnumerable

public abstract class CollectionBase : IList, ICollection, IEnumerable

CopyTo方法就是ICollection定义的。

普及一下知识啦:

接口根本没有什么继承概念。如果接口IB实现了接口IA,接口IC实现了接口IB,并不能说接口IC实现了IA。接口与继承不同,不具有传递性。接口仅仅是个很弱的定义功能,不能和继承同日而语,差很多很多功能,不能因为继承也可以规范接口定义就以为接口和继承很像。
lryfrank 2006-02-07
  • 打赏
  • 举报
回复
int IList.Add(Object value)
{
OnInsert(list.Count, value);

list.Add(value);
}

问题是CollectionBase是个抽象类。并没有实现Add的方法
而是

public abstract int Add();
zhangjianying 2006-02-07
  • 打赏
  • 举报
回复
强烈要求楼主加分
namespace System.Collections
public abstract class CollectionBase : IList {
ArrayList list=new ArrayList();

Object ICollection.SyncRoot {//因为和ICollection在同一个名称空间下所以直接调用
get { return InnerList.SyncRoot; }
}

public int Count {
get {
return list == null ? 0 : list.Count;
}
}


int IList.Add(Object value)
{
OnInsert(list.Count, value);

list.Add(value);
}

protected virtual void OnInsert(int index, Object value) {
}



}


基本上实现就这个样子
lryfrank 2006-02-07
  • 打赏
  • 举报
回复
应该是CollectionBase没有实现Add()方法吧
加载更多回复(6)

110,571

社区成员

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

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

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