它说 :
如果层次结构的不同级别有两种方法,则将首先选择“更深”的方法,即使它不是调用的“更好的函数成员”。
还 -
事实证明,如果您在子类中重写基类方法,则不算作声明。
现在让我们回到我的问题:
情况1
public class Base
{
public virtual void Foo(int x) { "1".Dump();}
}
public class Child : Base
{
public void Foo(object x) { "3".Dump();}
public override void Foo(int x) { "2".Dump();}
}
void Main()
{
Child c = new Child();
c.Foo(10); //emits 3
}
好的。根据文章
将首先选择“更深”的一个,即使它不是“更好的功能。而且它不计算覆盖......
所以它是正确的,程序发出“3”。(Foo(object x)
被执行)
让我们更改1 行的行顺序:
案例2
public class Base
{
public virtual void Foo(int x) { "1".Dump();}
public void Foo(object x) { "3".Dump();} //<line being moved here
}
public class Child : Base
{
public override void Foo(int x) { "2".Dump();}
}
void Main()
{
Child c = new Child();
c.Foo(10); //emits 2 !!!!
}
现在它发出“2”。
现在让我们将所有int 更改为 object并将所有object 更改为 int:
案例3
public class Base
{
public virtual void Foo(object x) { "1".Dump();}
public void Foo(int x) { "3".Dump();}
}
public class Child : Base
{
public override void Foo(object x) { "2".Dump();}
}
void Main()
{
Child c = new Child();
c.Foo(1); //emits "3"
}
问题:
问题#1:在案例 2 中,Child
继承了 Foo(object x)
它的父亲并且他还覆盖了一个方法。
但我们不是说:
事实证明,如果您在子类中重写基类方法,那不算作声明
???
事实上,我们也没有声明继承的函数......那么在这种情况下这里的规则是什么?
问题#2:在案例 3 中,Child
继承了 Foo(int x)
它的父亲并且他还覆盖了一个方法。
但是现在,他选择了它的父函数....
似乎override
只有在完全匹配的情况下才能获胜。
再说一次,在这种情况下,这里的规则是什么?