【问题标题】:How to affect descendants of a modified parent class in Delphi?如何影响 Delphi 中修改的父类的后代?
【发布时间】:2014-02-25 15:22:30
【问题描述】:

假设我在Unit1 中有两个类:TParent = class(TCustomControl)TDescendant = class(TParent),它们都有很多方法、字段和属性。

Unit2我需要修改TParent。假设我只需要修改一个方法,Method1,以一种非常简单的方式,它不会真正影响它本身之外的任何东西(比如,用红色而不是黑色打印文本)。我还需要TDescendant 受到此修改的影响(因此每次调用Method1 时都会执行修改后的Method1

有没有办法在 Delphi 7 中做到这一点,无需修改 Unit1 并且无需将整个 TDescendant 类复制到 Unit2

除此之外,我确实需要类名保持不变(我只是尝试修改 3rd 方控件中的方法,而不创建一个全新的控件来执行此操作)。

我在Unit2 中创建了TParent 的拦截器类,但我不知道如何(如果可能的话)“告诉”TDescendant 成为拦截器类的后代,而不是原来的。

【问题讨论】:

  • 所以,我不明白这个问题。为什么不直接换源?方法是虚拟的还是静态的?你可以使用运行时挂钩吗?
  • 我总是不想为了改变几行而复制整个单元。如果您可以仅正确覆盖您实际想要更改的内容,那就更清洁了。我猜这是个人喜好。我目前想要更改的方法是私有虚拟方法,但我的问题没有具体说明这一点,因为我也对更一般的答案感兴趣(如果明天我想对静态方法做同样的事情怎么办?)。使用运行时挂钩不是我真正熟悉的技术,也许这就是我正在寻找的?可以举个例子吗?
  • 虽然使用虚拟方法、继承链或钩子/迂回方法很有趣,但我实际上会修改第 3 方控制单元。
  • 我不明白你为什么不改变来源。为什么不这样做?它有效。
  • @David 我已经在之前的评论中解释了原因。不是我做不到,这实际上是我目前正在使用的解决方案,我只是不喜欢它,如果存在的话,我正在寻找更好的解决方案,仅此而已。每当我必须更改现有控件中的某些内容时,我总是使用拦截器类,它工作得很好,对我来说,它比不必要地将整个单元复制到我的应用程序的源代码中要干净得多。如果他们可以使用拦截器类,我不相信有人会更喜欢后者。所以这是同样的事情,只是一个更复杂的情况。

标签: delphi inheritance delphi-7


【解决方案1】:

据我所知,如果没有一些严重的低级黑客攻击(基于指针/内存),这是不可能的。因此,我根本不建议...(我也不知道该解决方案的实际答案)。

当您只想向TParent 类添加一些额外的方法时,您可以使用帮助类(Delphi XE+ - 甚至更早的版本)。

例如

TParentHelper = class helper for TParent
public
  procedure MyMethod(param: string);
end;

现在您可以执行以下操作:

uses
  MyParentHelperU;

Procedure test(D: TDescendant);
begin
  D.MyMethod('test');
end;

注意事项:

  1. 您需要包含定义帮助程序类的单元,才能使用此功能。
  2. 您只能将方法添加到已为其分配了帮助类的类(和后代)。您不能添加属性或字段。
  3. 受保护的属性可以由帮助类访问,但并不总是由 IDE 显示

【讨论】:

  • 他想修改私有函数的行为。这与用新的类扩展类完全不同。
猜你喜欢
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
  • 2020-12-22
  • 2015-04-15
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多