c#多态性和方法继承

本文关键字:继承 方法 多态性 | 更新日期: 2023-09-27 17:49:41

考虑以下类:

public class X {};
public class Y : X {};
public class Z : X {};
public class A {
    public bool foo (X bar) { 
        return false;
    }
};
public class B : A { 
    public bool foo (Y bar) { 
       return true;
    }
};    
public class C : A { 
    public bool foo (Z bar) { 
       return true;
    }
};

是否有一种方法可以实现以下期望的输出?

A obj1 = new B();
A obj2 = new C();
obj1.foo(new Y()); // This should run class B's implementation and return true
obj1.foo(new Z()); // This should default to class A's implementation and return false
obj2.foo(new Y()); // This should default to class A's implementation and return false
obj2.foo(new Z()); // This should run class C's implementation and return true

我遇到的问题是类A的实现总是被调用,而不管传递的参数。

c#多态性和方法继承

您需要使foo方法在A virtual类中,以便它可以被正确覆盖并以多态方式调用。

public class A { public virtual bool Foo (X bar) { ... } }
public class B { public override bool Foo (X bar) { ... } }

你现在做的方式,是有效地在BC中定义一个新的方法实现,只有当实例是该类型时才会调用。由于您将它们声明为类型A (A obj1 = new B();)并且该方法不是虚拟的,因此将始终调用A实现。

我相信您希望定义虚方法并用包含派生类型的签名覆盖它。这是不可能的,因为覆盖基本方法的方法应该具有相同的签名。这可能是因为这需要编译器应用复杂的遍历规则。因此,正如前面的答案所建议的那样,要获得所需的行为:

public class A { public virtual bool Foo (X bar) { ... } }
public class B { 
    public override bool Foo (X bar) {
         if(bar is Y) { ... } 
         else base.Foo(bar);
    }
}