Delphi 2010中抽象方法泛型类型参数声明为何如此难以实现?

2026-04-10 21:242阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计453个文字,预计阅读时间需要2分钟。

Delphi 2010中抽象方法泛型类型参数声明为何如此难以实现?

在Delphi 2010中尝试创建以下类定义,但遇到了编译器错误:

pascalTDataConverter=class abstractpublic function ConvertT(const AData: T): string; virtual; abstract;end;

错误信息为:E2533 虚拟、动态和消息方法不能包含 ...。

这是因为在Delphi中,抽象类不能包含任何构造器、析构器、消息方法或动态方法。以下是修改后的代码:

Delphi 2010中抽象方法泛型类型参数声明为何如此难以实现?

pascalTDataConverter=class abstractpublic function ConvertT(const AData: T): string; virtual; abstract;end;

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

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

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

E2533虚拟,动态和消息方法不能包含类型参数

我不太明白为什么我不能这样做.我可以在C#中做到这一点,例如

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

有谁知道这背后的原因?

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

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

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

本文共计453个文字,预计阅读时间需要2分钟。

Delphi 2010中抽象方法泛型类型参数声明为何如此难以实现?

在Delphi 2010中尝试创建以下类定义,但遇到了编译器错误:

pascalTDataConverter=class abstractpublic function ConvertT(const AData: T): string; virtual; abstract;end;

错误信息为:E2533 虚拟、动态和消息方法不能包含 ...。

这是因为在Delphi中,抽象类不能包含任何构造器、析构器、消息方法或动态方法。以下是修改后的代码:

Delphi 2010中抽象方法泛型类型参数声明为何如此难以实现?

pascalTDataConverter=class abstractpublic function ConvertT(const AData: T): string; virtual; abstract;end;

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

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

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

E2533虚拟,动态和消息方法不能包含类型参数

我不太明白为什么我不能这样做.我可以在C#中做到这一点,例如

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

有谁知道这背后的原因?

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

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

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