有趣的重载

假设要编写一个 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



你可能感兴趣的:(重载)