我可以在 C# 中重写使用派生类作为其参数的方法吗

2024-01-06

我有一个关于 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)
    {
    }
}

由于类型不变性/逆变性

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

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?

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

or:

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
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以在 C# 中重写使用派生类作为其参数的方法吗 的相关文章

随机推荐