それは言う:
階層の異なるレベルに2つのメソッドがある場合、呼び出しの「より優れた関数メンバー」でなくても、「より深い」メソッドが最初に選択されます。
また -
子クラスの基本クラスメソッドをオーバーライドした場合、それを宣言したとは見なされないことがわかりました。
さて、私の質問に戻りましょう:
ケース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
}
OK。記事によると
「より良い関数」でなくても、「より深い」ものが最初に選択されます。オーバーライドはカウントされません。
したがって、それは正しく、プログラムは「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をオブジェクトに変更し、すべてのオブジェクトを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
完全に一致する場合にのみ勝っているようです。
繰り返しますが、この状況でのルールは何ですか?