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