【发布时间】:2015-10-09 09:41:48
【问题描述】:
有一门课
TFoo = class
function GetValue<T>: T;
procedure SetValue<T>(AValue: T);
end;
编译器不允许将此类的方法定义为virtual。
怎么上课
TChildFoo = class(TFoo)
可以使用祖先的方法吗?
【问题讨论】:
标签: delphi generics delphi-xe2
有一门课
TFoo = class
function GetValue<T>: T;
procedure SetValue<T>(AValue: T);
end;
编译器不允许将此类的方法定义为virtual。
怎么上课
TChildFoo = class(TFoo)
可以使用祖先的方法吗?
【问题讨论】:
标签: delphi generics delphi-xe2
正如您所观察到的,泛型方法不能是虚拟的。这种类型
type
TFoo = class
function Bar<T>: T; virtual;
end;
被编译器拒绝并出现以下错误:
E2533 虚拟、动态和消息方法不能有类型参数
你的类是这样声明的:
type
TFoo = class
function GetValue<T>: T;
procedure SetValue<T>(AValue: T);
end;
你问一个子类如何使用这些方法。例如,您可以这样做:
type
TChildFoo = class(TFoo)
procedure DoSomething<T>;
end;
....
procedure TChildFoo.DoSomething<T>;
begin
SetValue(GetValue<T>);
end;
也就是说,你当然可以在父类中使用这些方法。您只是不能将它们声明为虚拟并覆盖它们。
如果你有一个参数化类(而不是参数化方法),那么你可以声明虚方法,并覆盖它们。
type
TFoo<T> = class
function Bar: T; virtual;
end;
TChildFoo<T> = class(TFoo<T>)
function Bar: T; override;
end;
所以,这些是您的选择。至于如何解决你的问题,很大程度上取决于问题是什么。
【讨论】: