0

以下に基本クラスのテスト定義があります

type
Tinfo = procedure of object;

Test = class(TObject)
public
  procedure Add    ( const a : Tinfo ); reintroduce ;
end;


procedure Test.Add(const a: Tinfo);
begin
  Writeln('base class add function');
  // dosomething more  
end;

そして、この基本クラスから派生したジェネリック クラスがあります。

TTesting<T> = class(Test)
   public
     procedure Add    ( const a : T  ); reintroduce ;
   end;

型キャストTしてTinfoいますが、エラーが発生します

procedure TTesting<T>.Add(const a : T );
begin
  inherited Add(Tinfo(a) );  // gives me error here 
end;

これを実装する方法はありますか?

4

1 に答える 1

1

まず、キャストが間違っています。明らかに、T ではなく a をキャストしたいのです。

ただし、オブジェクトのプロシージャーで型キャストを行いたい場合、それは多態的ではない型であり、それをジェネリック型に入れることはまったく意味がありません。

T はどうあるべきか? コード内の TInfo のみにすることができます。

ただし、T を任意のイベント/メソッド型にしたい場合は、TMethod を基本クラスに格納してから、ジェネリック クラスでそれを操作する必要があります。ただし、T をイベント タイプに制限する制約を設定することはできないことに注意してください。したがって、コンストラクターでそれを確認できます。

type
  PMethod = ^TMethod;

  Test = class(TObject)
  public
    procedure Add(const a: TMethod ); reintroduce ;
  end;

procedure Test.Add(const a: TMethod);
begin
  Writeln('base class add function');
  // dosomething more
end;

type
  TTesting<T> = class(Test)
  public
    constructor Create;
    procedure Add(const a: T); reintroduce ;
  end;

constructor TTesting<T>.Create;
begin
  Assert(PTypeInfo(TypeInfo(T)).Kind = tkMethod);
  inherited Create;
end;

procedure TTesting<T>.Add(const a: T);
begin
  inherited Add(PMethod(@a)^);
end;
于 2014-11-10T11:06:42.050 に答える