既然接口中的方法必须实现,为什么System.Collections中的接口能直接用?

kindliang 2011-02-21 11:42:58
请教大虾一个小问题:

既然接口中的方法都必须实现,为什么很多举例中,对于
IEnumerable和IEnumerator,都是直接上手使用,而并没有实现其方法?

比如以下代码:
1 int[] myArr ={10,11,12,13 };
2 IEnumerator ie = myArr.GetEnumerator();
3 while (ie.MoveNext())
4 {
5 int i = (int)ie.Current;
6 Console.WriteLine("\t{0}", i);
7 }
...全文
115 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xxmiiiiiiiiii 2011-02-22
  • 打赏
  • 举报
回复
myArr.GetEnumerator()返回一个对象的引用 这个引用被转换为IEnumerator类型 并存储在局部变量ie内
并不是说ie实际指向的就是一个接口 实际指向的其实还是原来的对象
wuyq11 2011-02-22
  • 打赏
  • 举报
回复
与IComparer and IComparable类似
后者这个接口用于类的实现,实现这个接口就可排序或者可枚举
前者一般是用在排序或者遍历的方法的参数,一般是匿名内部类的实现,这样就可以动态地指定排序或者枚举地规则了。IEnumerable的GetEnumerator返回一个实现了IEnumerator接口的对象
kindliang 2011-02-22
  • 打赏
  • 举报
回复
再等一会看看,不行就结贴了
宝_爸 2011-02-22
  • 打赏
  • 举报
回复
int[] myArr ={10,11,12,13 };
IEnumerator ie = myArr.GetEnumerator();
Console.WriteLine(ie.GetType().ToString());

由ie.GetType()可知, myArr.GetEnumerator的返回值的真正类型是System.Array.SZArrayEnumerator。它是类而不是接口。

lijunfeng 2011-02-22
  • 打赏
  • 举报
回复
你是通过 IEnumerator接口 来使用 myArr 对象。接口只是行为,不是主体,就像我可以命令一只猫去咬人也可以命令一只老虎去咬人,因为我知道它们都有“能咬人”这个接口,但是“咬人”只是“能咬人”接口中的行为,是个动词而不是主语,动词只有与主语联在一起才有意义,去咬人的还是那只猫或老虎本身。
kindliang 2011-02-22
  • 打赏
  • 举报
回复
呵呵,7点了都没吃饭~~ 还是多谢上面的帮助了....“若批评不自由则赞美无意义”,哈哈,很欣赏你的昵称!
vrhero 2011-02-22
  • 打赏
  • 举报
回复
我无语了,去吃饭了...哪位好心人给楼主从头解释一下吧...
kindliang 2011-02-22
  • 打赏
  • 举报
回复
我的意思是总要达到实现对比两个对象的目的,要达到这个功能,总要写代码吧
kindliang 2011-02-22
  • 打赏
  • 举报
回复
批评得很对,谢谢你,但是,我想不通的是,对象浏览器中看到的是声明,但总要实现啊,不实现的话,Compare(object, object)是如何比较两个对象的呢?但是这个实现,在继承的子类中又并没有实现,到底实现在哪里去了呢?
vrhero 2011-02-22
  • 打赏
  • 举报
回复
对象浏览器中看到的是声明不是实现...别光用眼睛看,动动脑子...
kindliang 2011-02-22
  • 打赏
  • 举报
回复
也许是我举例不对,这么说吧,对象浏览器中可以看到System.Collections.IComparer这个接口,其中Compare(object, object)这个方法,是比较两个对象并返回一个值。

奇怪的就是,为什么接口中可以放已经实现的方法。接口不是不能放具体方法吗?
vrhero 2011-02-22
  • 打赏
  • 举报
回复
不但要学会用眼睛去看,更要学会用脑袋去分析你看到的东西...1-3楼都说的很清楚了,你不明白是因为你只看不想...

直接用用的是什么?咬人的用的是咬吗?当然不是,用的是牙...虽然你只看到咬,但你应该想到那是牙干的...
kindliang 2011-02-22
  • 打赏
  • 举报
回复
呵呵,我好像没有说得太明白。不只是这个接口,在.net中的对象浏览器中查看到,其他也有接口是这样

我想问的是,既然接口中的方式必须在继承中的具体子类中实现,那么,为什么有些接口直接就用了,而并没有在子类中去实现它的方法?说不通啊

110,545

社区成员

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

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

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