在C ++中,我们可以这样做(伪代码):
class A {
public:
virtual void a(A a)=0;
}
class B : A {
public:
virtual void a(B b);
}
但是当我在C#中编写等价物时:
public abstract class A
{
public virtual void a(A a){}
}
public class B : A
{
public override void a(B b){}
}
编译器给出了一个错误,表示B.a没有覆盖A.a.为什么C#不允许这样做?允许这种做法是非常合理的,因为它遵循多态的原则。
答案 0 :(得分:5)
代码的C ++版本也没有覆盖该方法。但是因为C ++没有override
关键字¹,所以你不会得到错误,因为编译器不知道你想要覆盖这个方法。
如果您希望在C#中使用与C ++相同的行为,则可以删除override
关键字并将其替换为new
。
¹它在C ++ 11中有用,但我假设你没有使用它,否则你会遇到错误。
允许这种做法是非常合理的,因为它遵循多态的原则。
不,它没有。考虑一下:
A a = new B();
a.a(new A());
如果B.a
覆盖A.a
,则上述代码会使用参数B.a
调用new A()
。但B.b
采用B
类型的参数,因此不起作用。