簡體   English   中英

如何在delphi中進行通用類型轉換?

[英]How to do generic typecasting in delphi?

我在下面定義了一個基類測試

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;

有什么辦法可以實現呢?

首先,您的轉換是錯誤的,您顯然想要轉換a而不是T。

但是,如果要在對象的過程上鍵入強制類型轉換,則該對象的過程不能以任何方式進行多態處理,那么根本就沒有必要將其放入泛型類型。

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM