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) { ... } }
你目前的做法是在 B
和 C
中有效地定义一个新的方法实现,只有当实例属于该类型时才会被调用。由于您将它们声明为类型 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);
}
}
考虑以下 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) { ... } }
你目前的做法是在 B
和 C
中有效地定义一个新的方法实现,只有当实例属于该类型时才会被调用。由于您将它们声明为类型 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);
}
}