有趣的重载

假设要编写一个 DoWork 方法来根据传入的集合来处理"逻辑",同时希望能够通过IList, IDictionary, IEnumerator 或者ICollection。为此,可以定义四个不同的 DoWork 方法,如下例所示:

    class BusinessObject
    {
        
private BusinessObject()
        {
        }

        
public static string DoWord(IList list)
        {
            
return "list";
        }

        
public static string DoWord(IDictionary dictionary)
        {
            
return "dictionary";
        }

        
public static string DoWord(IEnumerator enumerator)
        {
            
return "enumerator";
        }

        
public static string DoWord(ICollection collection)
        {
            
return "collection";
        }
    }

   
    class Program
    {
        
static void Main(string[] args)
        {
            ArrayList list 
= new ArrayList();
            Console.WriteLine(BusinessObject.DoWord(list));

            Hashtable table 
= new Hashtable();
            Console.WriteLine(BusinessObject.DoWord(table));

            Queue queue 
= new Queue();
            Console.WriteLine(BusinessObject.DoWord(queue));

            Stack stack 
= new Stack();
            Console.WriteLine(BusinessObject.DoWord(stack));
        }
    }

   
得出的结果是:
list
dictionary
collection
collection

为什么会得出这样的结果呢? 我们再详细的看ArrayList, Hashtable, Queue, Stack实现的接口:

[SerializableAttribute]
[ComVisibleAttribute(
true)]
public class ArrayList : IList, ICollection, IEnumerable,
    ICloneable

[SerializableAttribute]
[ComVisibleAttribute(
true)]
public class Hashtable : IDictionary, ICollection, IEnumerable,
    ISerializable, IDeserializationCallback, ICloneable

[SerializableAttribute]
[ComVisibleAttribute(
true)]
public class Queue : ICollection, IEnumerable, ICloneable

[SerializableAttribute]
[ComVisibleAttribute(
true)]
public class Stack : ICollection, IEnumerable, ICloneable
(以上资料来自MSDN)

我们可以看到每个类都有可能执行两种不同的方法,那我们就要思考为什么得出这样的结果?
或者我们用另一个角度去想, 我们去实现那些接口或许能知道, 先在同一个项目里实现:

Class

    结果的编译不能通过.
    错误是 : 错误    1    在以下方法或属性之间的调用不明确:“TryOverride.BusinessObject.DoWord(System.Collections.IList)”和“TryOverride.BusinessObject.DoWord(System.Collections.IEnumerator)”    ..\TryOverride\TryOverride\Program.cs    28    22    TryOverride

TestCollection类和ArrayList实现的接口都一样,为什么编译错误呢?
我们在不同的项目中再写一个TestTable类实现的接口和HashTable一样(详细请下载代码),编译就可以通过.
这是dotNet问题还是VS2005的问题呢? 呵呵.

http://files.cnblogs.com/wanggh/TryOverride.zip



posted @ 2007-03-08 01:53 wanggh 阅读(2640) 评论(8)  编辑 收藏 网摘

  回复  引用  查看    
#1楼 2007-03-08 08:55 | 非我      
代码不能展开-_-
  回复  引用    
#2楼 2007-03-08 09:20 | 革命老前辈[未注册用户]
10年前就知道了
  回复  引用    
#3楼 2007-03-08 09:27 | Woodcode[未注册用户]
代码看不到。
  回复  引用    
#4楼 2007-03-08 09:40 | 随风.NET[未注册用户]
syntax error
[Break on this error] this.style.display='none'; code_closed_text_014950.style.display=

  回复  引用    
#5楼 2007-03-08 09:41 | 随风.NET[未注册用户]
代码看不到。
  回复  引用    
#6楼 2007-03-08 09:45 | yzx110[未注册用户]
仔细想想也能明白

你可以看一下结构 IList,ICollection,IDictionary,IEnumerable,IEnumerator的关系

然后看一下Hashtable/Queue/Stack/ArrayList分别实现了那些接口
这些类实现的接口基本上都有一个is a的关系,所有用这些类作参数的时候都能精确找到最匹配IList、IDictionary、ICollection这些接口类型的方法。
注意这些类并没有实现IEnumerator。
而你写得类TestCollection却实现了IEnumerator,但是IEnumerator与其他几个接口没有is a的关系,所有编译器在选择DoWork(IEnumerator)和DoWork(IList)时发生了困难。


主要是一个IEnumerator和IEnumerable的区别。

  回复  引用  查看    
#7楼 2007-03-08 17:26 | JesseZhao      
知道了一段时间了
  回复  引用    
#8楼 2007-06-26 08:54 | fieroazul[未注册用户]
IEnumerable 继承了IEnumerator



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 667582




相关文章:

相关链接: