问题描述
如题,我如果像下面这样来继承IEnumerable接口,返回一个成员的IEnumerable接口是可以工作,但是问题是,这个IEnumerable在被调用者访问的时候,内部是是调用的GetNext对吧。这个GetNext函数如果是个虚函数的话,是不是调用的是M类的GetNext函数,而不是Dictionary<string,int>的GetNext函数?我感觉应该是调用M类型的GetNext函数,因为是多态调用,对吧。那么我是不是应该重载GetNext函数和HasNext函数?classM:IEnumerable{Dictionary<string,int>m_table;#regionIEnumerableMemberspublicIEnumeratorGetEnumerator()//能否通过IEnumerator来修改元素?枚举器和迭代器还是有区别的?{returnm_table.GetEnumerator();}public??GetNext()//如果自己不重载,如何,那么IEnumerator默认调用的GetNext,到底拿到了什么元素?{}boolHasNext(){}#endregion}
解决方案
解决方案二:
迭代器只是c#(其实vb.net也是)的语法糖,它实际上还是生成了一个独立的class的。然后调用迭代器方法的程序,实际上真实的代码还是先new这个对象实例,然后调用其GetEnumerator()方法的。只不过使用迭代器的简洁的语法,你不需要手写那么多代码了。
解决方案三:
对于你贴出来的代码,你还是写一个可执行的吧。不然你列出来的代码有太多的bug,解释它很困难。
解决方案四:
IEnumerable只要实现GetEnumerator就可以了。publicinterfaceIEnumerable{IEnumeratorGetEnumerator();}
IEnumerator才需要GetNext等。
解决方案五:
引用1楼sp1234的回复:
迭代器只是c#(其实vb.net也是)的语法糖,它实际上还是生成了一个独立的class的。然后调用迭代器方法的程序,实际上真实的代码还是先new这个对象实例,然后调用其GetEnumerator()方法的。只不过使用迭代器的简洁的语法,你不需要手写那么多代码了。
你的意思是说,如果我从IEnumerable继承,那么实际上还有一个隐藏的类产生?是IEnumerable使得我产生了一个隐藏的内部类吗?能否明示?谢谢