我可以覆盖一个方法,使用派生类作为c#中的参数

时间:2015-09-28 22:21:01

标签: c# override

我对c#中的覆盖有疑问。 为什么我不能用c#?

覆盖派生类作为参数的方法 像这样:

class BaseClass
{
}

class ChildClass:BaseClass
{
}

abstract class Class1
{
    public virtual void Method(BaseClass e)
    {
    }
}

abstract class Class2:Class1
{
    public override void Method(ChildClass e)
    {
    }
}

1 个答案:

答案 0 :(得分:3)

由于类型不变/逆变

这是一个简单的思考实验,使用您的类定义:

Class1 foo = new Class1();
foo.Method( new BaseClass() ); // okay...
foo.Method( new ChildClass() ); // also okay...

Class1 foo = new Class2();
foo.Method( new BaseClass() ); // what happens?

如果您不关心方法多态,那么可以添加一个名称相同但方法不同(甚至更多)的方法(作为重载),但它赢了&# 39;是一个vtable(虚拟)方法,它覆盖父类中的前一个方法。

class Class2 : Class1 {
    public void Method(ChildClass e) {
    }
}

另一种选择是覆盖,但要么分支和委托给基础实现,要么断言你对所使用的参数的假设:

class Class2 : Class1 {
    public override void Method(BaseClass e) {
        ChildClass child = e as ChildClass;
        if( child == null ) base.Method( e );
        else {
            // logic for ChildClass here
        }
    }
}

或:

class Class2 : Class1 {
    public override void Method(BaseClass e) {
        ChildClass child = e as ChildClass;
        if( child == null ) throw new ArgumentException("Object must be of type ChildClass", "e");

        // logic for ChildClass here
    }
}