TVirtualMethodInterceptor(デルファイ)

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; //それが消える前に、コンソールに何があるか参照してください。
終わり。
公開された30元の記事 ウォンの賞賛2 ビュー50000 +

おすすめ

転載: blog.csdn.net/khzide/article/details/87441713