IEnumerable是否应该实现IEnumerable接口
2009-02-03 00:42
253 查看
C#2.0的遍历器(Iterator),应该是对Gamma提出的Iterator设计模式的实现。在C#中,如果某个类型继承了接口IEnumerable,或者继承了泛型接口IEnumerable <T> ,或者继承了泛型接口IEnumerable <T> 的任何一个构造类型(如IEnumerable <int> ),那么称该类型是“可遍历的”(“可枚举的”)。
MSDN中创建遍历器的示例代码是:
public class Stack <T> : IEnumerable <T>
{
T[] items;
int count;
public void Push(T data) {...}
public T Pop() {...}
public IEnumerator <T> GetEnumerator()
{
for (int i = count – 1; i > = 0; --i)
yield return items[i];
}
}
但这样编译将会报错“Stack不会实现接口成员IEnumerable.GetEnumerator”
究其原因,是由于IEnumerable <T> 居然继承了IEnumerable接口,那么Stack <T> 也就隐含继承了IEnumerable,因此需要实现其返回类型为IEnumerator的GetEnumerator方法。在这里,类中需要加上下面的代码才能保证正确:
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
这会给初学者带来很大的迷惑。有些外文资料解释说,所有的新的泛型接口都应该继承以前object型对应接口。个人认为,不应该让IEnumerable <T> 继承IEnumerable;在需要时,可以让一个类继承IEnumerable,又继承IEnumerable <T> ,那就把两个接口都写出来好了:
public class Stack <T> : IEnumerable <T> , IEnumerable
但实际上,.NET Framwork中的大量泛型接口都不存在这种情况,如IComparer <T> 没有继承IComparer,ICollection <T> 没有继承ICollection,等等。
而且,在.NET Framwork 2.0的Beta2版本中,并没有出现这种情况,而MSDN中的代码原来是可以通过编译的。只是到了正式版,IEnumerable <T> 就突然多继承了一个IEnumerable(此外还有IEnumerator <T> 继承了IEnumerator)
MSDN中创建遍历器的示例代码是:
public class Stack <T> : IEnumerable <T>
{
T[] items;
int count;
public void Push(T data) {...}
public T Pop() {...}
public IEnumerator <T> GetEnumerator()
{
for (int i = count – 1; i > = 0; --i)
yield return items[i];
}
}
但这样编译将会报错“Stack不会实现接口成员IEnumerable.GetEnumerator”
究其原因,是由于IEnumerable <T> 居然继承了IEnumerable接口,那么Stack <T> 也就隐含继承了IEnumerable,因此需要实现其返回类型为IEnumerator的GetEnumerator方法。在这里,类中需要加上下面的代码才能保证正确:
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
这会给初学者带来很大的迷惑。有些外文资料解释说,所有的新的泛型接口都应该继承以前object型对应接口。个人认为,不应该让IEnumerable <T> 继承IEnumerable;在需要时,可以让一个类继承IEnumerable,又继承IEnumerable <T> ,那就把两个接口都写出来好了:
public class Stack <T> : IEnumerable <T> , IEnumerable
但实际上,.NET Framwork中的大量泛型接口都不存在这种情况,如IComparer <T> 没有继承IComparer,ICollection <T> 没有继承ICollection,等等。
而且,在.NET Framwork 2.0的Beta2版本中,并没有出现这种情况,而MSDN中的代码原来是可以通过编译的。只是到了正式版,IEnumerable <T> 就突然多继承了一个IEnumerable(此外还有IEnumerator <T> 继承了IEnumerator)
相关文章推荐
- 判断一下一个应用程序是否结束,应该怎么实现?
- 在一个程序中需要用到全局变量(在多个class之间共享数据),请问如何定义具有这种功能的变量?或者是否有其他的方法解决多个class之间的数据共享(尽量简单实现)。 首先应该明确 Java中没有全局变
- 关于IEnumerable 是否应该继承IEnumerable(老外讨论的很多)
- 关闭浏览器再打开,网站是否应该自动登录以及如何实现呢?
- 头文件里面是否应该包含函数的实现
- 异想天开:短信协议是否应该变革一点?
- java代码实现身份证第18位的计算和验证身份证号码是否是真实有效.
- php中判断字符串是否全是中文或含有中文的实现代码
- shell脚本实现轮询查看进程是否结束
- 匿名内部类是否可以继承其它类是否可以实现接口 _JAVA面试题及答案
- 招聘是否应该属于HR
- ViewPager实现是否预加载,解决Tablayout匹配使用
- 一起动手实现Windows服务程序(监控网站是否能访问)
- 判断两个单链表是否相交--java实现
- GridView 结合ymPrompt脚本实现的确认是否删除操作
- perl实现检测服务器中的服务是否正常脚本分享
- C# Ping Ip 网络是否畅通实现
- Android应用如何监听自己是否被卸载及卸载反馈功能的实现(第三版)
- 应该如何实现NSCopying协议
- JS实现的用来对比两个用指定分隔符分割的字符串是否相同