Delphi 抽象函数调用的名称与基类不同

发布于 2024-10-16 10:14:26 字数 753 浏览 5 评论 0原文

假设我有一个函数

function GetFieldName(FieldIndex: Integer; FieldName: PChar; 
    Len: Integer): Integer; virtual; abstract;

,并且我正在尝试添加

function GetFieldNameA(FieldIndex: Integer; FieldName: PAnsiChar; 
    Len: Integer): Integer;

它将暂时桥接我的 unicode 数据库连接。

我想继续调用 GetFieldName,使其不抽象,并进行一些位类型转换来调用 GetFieldNameA,这将成为第一个 GetFieldName 的技术抽象版本。 (我根本不想更改基类)

是否有一种方法,例如为外部引用添加“name”关键字,可以在子类中使用具有不同名称的抽象函数?

我想象的最终结果是这样的:

function GetFieldName(FieldIndex: Integer; FieldName: PChar; 
    Len: Integer): Integer; 
function GetFieldNameA(FieldIndex: Integer; FieldName: PAnsiChar;
    Len: Integer): Integer name 'GetFieldName Virtual Abstract'; 

Say I've got a function

function GetFieldName(FieldIndex: Integer; FieldName: PChar; 
    Len: Integer): Integer; virtual; abstract;

and I'm trying to add

function GetFieldNameA(FieldIndex: Integer; FieldName: PAnsiChar; 
    Len: Integer): Integer;

Which will temporarily bridge my database connection for unicode.

I want to continue to call GetFieldName, make it not abstract, and do some bit typecasting to call GetFieldNameA, which will become a technically abstract version of the first GetFieldName. (I don't want to change the base class at all)

Is there a way, like adding the 'name' keyword for external references, to have an abstract function with a different name in the subclass?

What I'm imagining ending up with is something like:

function GetFieldName(FieldIndex: Integer; FieldName: PChar; 
    Len: Integer): Integer; 
function GetFieldNameA(FieldIndex: Integer; FieldName: PAnsiChar;
    Len: Integer): Integer name 'GetFieldName Virtual Abstract'; 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

扛起拖把扫天下 2024-10-23 10:14:26

不,你不能按照你的建议去做。

相反,请覆盖 GetFieldName。在调用 GetFieldNameA 之前,将 PChar 转换为 PAnsiChar(如有必要)。后者不必(实际上也不能)被标记为覆盖。它可以是普通的非虚函数。

该建议的不幸部分是您必须在每个后代类中执行此操作。另一种方法是向基类添加虚拟抽象 GetFieldNameA,然后更改所有后代以覆盖它,而不是 GetFieldName。更改基类中的 GetFieldName 以调用 GetFieldNameA。但如果你不能改变基类,那是行不通的。

No, you can't do what you're proposing.

Instead, override GetFieldName. Have it convert the PChar to a PAnsiChar (if necessary) before calling GetFieldNameA. The latter doesn't have to be (and can't, actually) be marked override. It can be an ordinary non-virtual function.

The unfortunate part of that suggestion is that you'd have to do it in every descendant class. The alternative is to add a virtual abstract GetFieldNameA to the base class and then change all the descendants to override that instead of GetFieldName. Change GetFieldName in the base class to call GetFieldNameA. But that's a non-starter if you can't change the base class.

冰雪梦之恋 2024-10-23 10:14:26

如果我正确理解你的问题,你可以通过注入替换的基类来欺骗 Delphi。

如果声明原始 GetFieldName 的类称为在 Unit1(pas 或 dcu)中声明的 TClass1,则:

  • 创建一个新单元(TrickUnit.pas)。
  • 在TrickUnit.pas中的uses部分添加旧类的unit(TrickUnit.pas使用Unit1)
  • 在TrickUnit.pas中声明与原始类同名的类,并使其继承原始类类型TClass1 = class(Unit1.TClass1)
  • 覆盖 GetFieldName 并添加您的自定义实现。
  • 只需在需要原始类的每个单元的使用部分(界面部分)的末尾添加 TrickClass.pas

只要 TrickUnit.pas 位于使用部分的末尾,您的所有后代都会结束继承被替换的类,除了添加 using ......, TrickUnit 之外,无需更改任何代码

If I understood your question correctly you can trick Delphi by injecting replaced base class.

If the class that declares original GetFieldName is called TClass1 declared in Unit1(pas or dcu), then:

  • make a new unit (TrickUnit.pas).
  • In the TrickUnit.pas add unit of the old class in the uses section (TrickUnit.pas uses Unit1)
  • In the TrickUnit.pas declare the class with the same name as the original class, and make it inherit the original class type TClass1 = class(Unit1.TClass1)
  • override GetFieldName and add your custom implementation.
  • Just add TrickClass.pas at the end of uses section (interface part) of each unit that expects original class

As long as TrickUnit.pas is at the end of uses section, all of your descendants will end up inheriting your replaced class with no code changes other than adding using ......, TrickUnit

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文