TVirtualMethodInterceptor(デルファイ)
コンテンツ
[ 非表示 ]
説明
実行時、オーバーライドメソッドでクラスから派生するTVirtualMethodInterceptorクラスを使用します(ただし、新しいインスタンスフィールドを追加していない)、この新しい派生クラスをインスタンスの実行時の型を変更します。
すべての仮想メソッドは、破壊時に呼ばれるものを含めて、傍受されていることに注意してくださいは、ただ一つはここに宣言されていません。(デストラクタ自体は含まれていません。)
コード
使用 sysutilsの、 RTTIを。 入力 TFoo =クラス // FROB倍xおよび新しいX + 10返す 関数FROB(VAR X:整数):整数。バーチャル; 終わり; 関数TFoo.Frob(VARのX:整数):整数。 開始 X:= X * 2。 結果:= X + 10。 終わり; 手順WorkWithFoo(フー:TFoo)。 VaRの A、B:整数; 開始 := 10; writeln( '[WorkWithFoo]前:=')。 試す Bを:= Foo.Frob(); writeln( '[WorkWithFoo]結果='、B)。 writeln( '[WorkWithFoo]後:=')。 除く E上:例外DO writeln( '例外:'、e.ClassName)。 終わり; 終わり; 手順P; VaRの FOO:TFoo。 VMI:TVirtualMethodInterceptor。 開始 VMI:= nilを; FOO:= TFoo.Create。 試す のwriteln( '牛車の前に:'); WorkWithFoo(FOO)。 VMI:= TVirtualMethodInterceptor.Create(foo.ClassType)。 vmi.OnBefore:=手順(インスタンス:TObjectを;方法:TRttiMethod; constのArgsの:TARRAY <TValue>; DoInvokeアウト:ブール;アウト結果:TValue) VAR I:整数; 開始 ( '引数を持つ:' '[OnBefore]を呼び出す'、Method.Name、)書き込み。 1 DO -長さに= 0(Argsの):私のために (Argsの[I] .ToStringを、 '「)書きます。 writeln; 終わり; 私たちの新しい動的に//変更し、fooのメタクラスポインタが派生 //と子孫傍受 vmi.Proxify(FOO)を、 ( '傍受した後:')のwriteln。 WorkWithFoo(FOO)。 最後に foo.Free; vmi.Free; 終わり; 終わり; 開始 Pを、 readln; //それが消える前に、コンソールに何があるか参照してください。 終わり。