base.base.method() の呼び出し:
オブジェクト指向プログラミングでは、base と派生クラスを使用してクラス階層を作成するのが一般的です。クラス。派生クラスのメソッドをオーバーライドする場合、base を使用して基本クラスの実装を呼び出すことができます。ただし、特定のシナリオでは、基本クラスの基本クラスにアクセスする必要がある状況が発生することがあります。
次のコード例を考えてみましょう。
class Base { public virtual void Say() { Console.WriteLine("Called from Base."); } } class Derived : Base { public override void Say() { Console.WriteLine("Called from Derived."); base.Say(); } } class SpecialDerived : Derived { public override void Say() { Console.WriteLine("Called from Special Derived."); base.Say(); } }
sd を呼び出すとき。 SpecialDerived のインスタンスに対して Say() を実行すると、次の出力が期待されます:
Called from Special Derived. Called from Derived. Called from Base.
しかし、実際にはget:
Called from Special Derived. Called from Derived. /* this is not expected */ Called from Base.
Derived.Say() への予期しない呼び出しは、base が常に階層内の直接の基本クラスを参照するためです。したがって、SpecialDerived.Say() は、Base.Say() を呼び出す前に Derived.Say() を呼び出します。
この動作を回避するには、base.base.method() を直接使用できません。代わりに、次のアプローチを利用できます。
class Derived : Base { public override void Say() { CustomSay(); base.Say(); } protected virtual void CustomSay() { Console.WriteLine("Called from Derived."); } } class SpecialDerived : Derived { protected override void CustomSay() { Console.WriteLine("Called from Special Derived."); } }
中間メソッド CustomSay() を導入することにより、派生クラス呼び出しチェーンで実行される内容を制御できます。この場合、SpecialDerived は CustomSay() をオーバーライドして独自の動作を提供し、実質的に Derived.CustomSay() をスキップします。
または、以下に示すように、リフレクションを使用して基本クラスのメソッド ハンドルにアクセスし、それを直接呼び出すこともできます。
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# で基本クラスの基本クラス メソッドを呼び出す方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。