Delphi 2010 - 为什么我不能使用泛型类型参数声明抽象方法?

时间:2010-03-23 15:13:02

标签: delphi generics delphi-2010 compiler-errors

我正在尝试在Delphi 2010中执行以下操作:

TDataConverter = class abstract
public
    function Convert<T>(const AData: T): string; virtual; abstract;
end;

但是,我不断收到以下编译器错误:

E2533 Virtual, dynamic and message methods cannot have type parameters

我不太明白为什么我不能这样做。我可以用C#来做到这一点。

public abstract class DataConverter
{
    public abstract string Convert<T>(T data);
}

有人知道这背后的原因吗?

1 个答案:

答案 0 :(得分:7)

你可以在.NET中完成它,因为Delphi和.NET处理泛型不同。我不太了解细节。我知道为什么你不能在Delphi中做到这一点。

每个虚方法都必须在类的虚方法表中有一个插槽。这必须在编译单元时进行设置,以便将其信息输入DCU。 (同样,每个动态方法都必须在动态方法表中有一个条目,在编译单元时。)

但是如果你创建泛型方法,那么每次在代码中调用它时,都会创建一个特定于该类型参数的不同代码副本。这对于以不同方式处理不同类型是必要的。 (例如,如果传入接口或字符串,则必须处理引用计数。)但是您无法为它们创建新的虚拟方法和新的VMT插槽,因为已经创建了DCU并且{ {3}}