base.base.method() の呼び出し
このコードには、SpecialDerived が Derived から継承するクラス階層があります。 Base から継承します。各クラスには、どのクラスから呼び出されたかを示すメッセージを出力する、オーバーライドされた Say() メソッドがあります。
Main() メソッドで sd.Say() が呼び出されると、次の出力が期待されます。
Called from Special Derived. Called from Derived. Called from Base.
ただし、実際の出力には Derived.Say() への予期しない呼び出しが含まれています。
これを防ぐために、次のように変更できます。 SpecialDerived クラスは、Say() をオーバーライドする代わりに CustomSay() メソッドを使用します。この方法では、sd.Say() が呼び出されたときに CustomSay() メソッドのみが呼び出されます。
class SpecialDerived : Derived { protected override void CustomSay() { Console.WriteLine("Called from Special Derived."); } }
別の回答で説明されている別の方法は、次の方法を使用して Base の Say() メソッドに直接アクセスすることです。反映:
class SpecialDerived : Derived { public override void Say() { Console.WriteLine("Called from Special Derived."); var ptr = typeof(Base).GetMethod("Say").MethodHandle.GetFunctionPointer(); var baseSay = (Action)Activator.CreateInstance(typeof(Action), this, ptr); baseSay(); } }
このアプローチは技術的には可能ですが、悪い習慣とみなされているため推奨されません。
以上がC# 継承で「base.base.method()」を呼び出すと予期しない結果が生じるのはなぜですか?また、それを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。