【问题标题】:Delphi 2010 - Why can't I declare an abstract method with a generic type parameter?Delphi 2010 - 为什么我不能用泛型类型参数声明抽象方法?
【发布时间】:2010-03-23 15:13:01
【问题描述】:

我正在尝试在 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);
}

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

【问题讨论】:

    标签: delphi generics delphi-2010 compiler-errors


    【解决方案1】:

    您可以在 .NET 中执行此操作,因为 Delphi 和 .NET 处理泛型的方式不同。我知道的不够详细。不过,我确实知道为什么你不能在 Delphi 中做到这一点。

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

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

    【讨论】:

    • .NET 在运行时实例化泛型类型和方法,并且可以执行必要的技巧来调度虚拟泛型方法,这将包括实例化具体后代和原始基类定义之间的所有覆盖,以及就像使用动态结构进行方法分派一样。
    • @Barry & @Mason,感谢您提供的信息。我决定改变我的设计。
    • 我认为这与接口方法不能有类型参数的原因相同。
    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 2023-03-11
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多