C#方法重载 - 派生类型

时间:2016-02-04 20:44:04

标签: c# polymorphism overloading constructor-overloading

在以下情况下,C#确定构造函数(或方法)的哪个重载使用的规则是什么:

  • 过载仅因参数类型
  • 而异
  • 重载都属于同一类型层次结构

请考虑以下事项:

  • 从List派生的自定义类型(此处仅为部分表示;让我们为了练习而说,该类将一些元数据概念添加到List中):

    public class CustomList<Type> : List<Type>
    {
        public CustomList() : base() { }
    
        [...]
    
    }
    
  • 具有不同构造函数的类,它采用不同级别的类层次结构:

    public class SomeClass
    {
        public SomeClass(IEnumerable<object> ienumerable) { }
    
        public SomeClass(IList<object> list) { }
    
        public SomeClass(CustomList<object> customList) { }
    }
    

将在以下代码中调用哪个构造函数,以及如何解决重载?:

CustomList<object> customList = new CustomList<object>();

List<object> list = new List<object>();

IEnumerable<object> enumerable = new object[1];
IEnumerable<object> customListWrappedInEnumerable = new CustomList<object>();

SomeClass customListBuilt = new SomeClass(customList);

SomeClass listBuilt = new SomeClass(list);

SomeClass enumerableBuilt = new SomeClass(enumerable);
SomeClass wrappedCustomListBuilt = new SomeClass(customListWrappedInEnumerable);

作为第二个问题,构造函数的重载规则是否与其他实例方法相同?如果我有这个课程:

public static class DoSomethingClass
{
    public void DoSomething(IEnumerable<object> ienumerable) { }

    public void DoSomething(IList<object> list) { }

    public void DoSomething(CustomList<object> customList) { }
}

我打电话给

DoSomethingClass.DoSomething(list);
DoSomethingClass.DoSomething(customList);
DoSomethingClass.DoSomething(enumerable);
DoSomethingClass.DoSomething(customListWrappedInEnumerable);

是与构造函数相同或不同的行为?而且,如果DoSomethingClass是实例类型,那么

DoSomethingClass do = new DoSomethingClass();
do.DoSomething(customListWrappedInEnumerable);
[...]

有什么不同吗?

到目前为止,我的观察结果是传递给构造函数/方法的引用类型完全决定了选择哪个构造函数。即包含在IEnumerable重载中的CustomList包含在IEnumerable构造函数中。假设情况总是如此,或者是他们的例外吗?我是否正确?

0 个答案:

没有答案