我在下面定义了基类测试
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;
有什么办法可以实现吗?
答案 0 :(得分:1)
首先你的演员是错的,你显然想要演员而不是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;