有趣的重载
假设要编写一个 DoWork 方法来根据传入的集合来处理"逻辑",同时希望能够通过IList, IDictionary, IEnumerator 或者ICollection。为此,可以定义四个不同的 DoWork 方法,如下例所示:
得出的结果是:
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)
我们可以看到每个类都有可能执行两种不同的方法,那我们就要思考为什么得出这样的结果?
或者我们用另一个角度去想, 我们去实现那些接口或许能知道, 先在同一个项目里实现:
结果的编译不能通过.
错误是 : 错误 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的问题呢? 呵呵.
https://files.cnblogs.com/wanggh/TryOverride.zip
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";
}
}
{
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));
}
}
{
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
我们可以看到每个类都有可能执行两种不同的方法,那我们就要思考为什么得出这样的结果?
或者我们用另一个角度去想, 我们去实现那些接口或许能知道, 先在同一个项目里实现:
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的问题呢? 呵呵.
https://files.cnblogs.com/wanggh/TryOverride.zip