如何使用泛型方法继承类?

use*_*862 3 delphi generics delphi-xe2

有一个班

TFoo = class
  function GetValue<T>: T;
  procedure SetValue<T>(AValue: T);
end;
Run Code Online (Sandbox Code Playgroud)

编译器不允许将此类的方法定义为virtual. 怎么上课

TChildFoo = class(TFoo)
Run Code Online (Sandbox Code Playgroud)

可以使用祖先的方法吗?

Dav*_*nan 5

正如您所观察到的,泛型方法不能是虚拟的。这个类型

type
  TFoo = class
    function Bar<T>: T; virtual;
  end;
Run Code Online (Sandbox Code Playgroud)

被编译器拒绝,并出现以下错误:

E2533 虚拟、动态和消息方法不能有类型参数

你的类是这样声明的:

type
  TFoo = class
    function GetValue<T>: T;
    procedure SetValue<T>(AValue: T);
  end;
Run Code Online (Sandbox Code Playgroud)

你问子类如何使用这些方法。例如,您可以这样做:

type
  TChildFoo = class(TFoo)
    procedure DoSomething<T>;
  end;

....

procedure TChildFoo.DoSomething<T>;
begin
  SetValue(GetValue<T>);
end;
Run Code Online (Sandbox Code Playgroud)

换句话说,您当然可以在父类中使用这些方法。您只是不能将它们声明为虚拟并覆盖它们。

如果您有参数化类(而不是参数化方法),那么您可以声明虚拟方法并覆盖它们。

type
  TFoo<T> = class
    function Bar: T; virtual;
  end;

  TChildFoo<T> = class(TFoo<T>)
    function Bar: T; override;
  end;
Run Code Online (Sandbox Code Playgroud)

所以,这些是你的选择。至于如何解决你的问题,这在很大程度上取决于问题是什么。