C# 多态性和方法继承

C# Polymorphism and Method Inheritance

考虑以下 classes:

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

我遇到的问题是 class 无论传递的参数如何,A 的实现总是被调用。

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

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);
    }
}