base.base.method() の例外的な呼び出し
基本構造からクラスを派生する場合、base キーワード直接の親クラスで定義されたメンバーへのアクセスを許可します。ただし、例外的な状況では、継承階層のさらに上のクラスからメソッドを呼び出す必要がある場合があります。
Derived が Say() をオーバーライドする、提供されたコード シナリオを考えてみましょう。 ベースのメソッド。 SpecialDerived 内で、後続の Say() のオーバーライドは base.Say() を呼び出し、Say() を実行することを目的としています。 >ベース.
予想 vs.実際の動作
予想される出力は次のとおりです:Called from Special Derived. Called from Base.
Say()から派生:
Called from Special Derived. Called from Derived. Called from Base.
base.base.method()
の直接呼び出しはサポートされていない場合は、別のアプローチが必要です。 SpecialDerived で提供されている更新された実装は、次のことを示しています。
追加の保護された仮想メソッドclass SpecialDerived : Derived { public override void Say() { Console.WriteLine("Called from Special Derived."); CustomSay(); // Calls CustomSay() from Derived instead of Say() base.Say(); } protected virtual void CustomSay() { Console.WriteLine("Called from Derived."); } }
を定義することで、Derived は次のことができます。他の派生に影響を与えることなく、目的の動作を処理します。 class.
代替リフレクション アプローチ継承構造の変更が実現できないシナリオでは、以下に示すようにリフレクション ベースのアプローチを採用できます。
このアプローチでは、リフレクションを利用して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(); } }
メソッドを動的に取得します。 Base を作成し、標準のメソッド解決プロセスを回避して直接実行します。
以上が基本クラスのメソッドをオーバーライドした派生クラスから呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。