【问题标题】:can i override a method with a derived class as its parameter in c#我可以用派生类作为c#中的参数覆盖一个方法吗
【发布时间】:2015-09-29 06:24:52
【问题描述】:

我对 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)
    {
    }
}

【问题讨论】:

  • 你尝试的时候发生了什么?
  • 那行不通。当您覆盖一个方法时,它必须具有相同的签名。这意味着相同的确切参数。

标签: c# overriding


【解决方案1】:

因为类型不变/逆变

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

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?

如果您不关心方法多态性,您可以添加一个具有相同名称但不同(甚至更多派生)参数的方法(作为重载),但它不会覆盖父类中先前方法的 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
    }
}

【讨论】:

  • 谢谢。你的回答很有用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 2010-11-10
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
相关资源
最近更新 更多