【发布时间】:2014-05-02 06:19:42
【问题描述】:
父过程如何调用被自身覆盖的子过程?
type
TBase = class(TForm)
procedure BtnRefreshClick(Sender: TObject);
protected
text: string;
end;
procedure TBase.BtnRefreshClick(Sender: TObject);
begin
showmessage(text);
end;
type
TParent = class(TBase)
protected
procedure doThis;
end;
procedure TParent.doThis;
begin
// blah blah do something
BtnRefreshClick(nil);
end;
type
TChild = class(TParent)
procedure BtnRefreshClick(Sender: TObject);
protected
procedure clicky; override;
end;
procedure TChild.BtnRefreshClick(Sender: TObject);
begin
text := 'Hello, World!';
inherited;
end;
实际调用过程会有点像:
child := TChild.Create;
child.doThis;
如果我尝试执行child.BtnRefreshClick;,那么它将产生一个Hello, World! 的对话框,因为调用了TChild.BtnRefreshClick 并设置了text 变量。
但是当我调用child.doThis 时,它只会显示一个空对话框,因为child.doThis 调用parent.doThis 然后??.BtnRefreshClick。如何让parent.doThis 拨打child.BtnRefreshClick?不可能吗?
提前致谢,
尤汉·W。
【问题讨论】:
-
您所说的与您的代码不符。如果实例是 TChild,则 doThis 将调用 TChild.Clicky,因为此方法是虚拟的并且被覆盖。此外,当您谈论两种不同的 doThis 方法时,我只看到一种。
-
@StefanGlienke:不是真的。
clicky实际上是 TParent 父类上的TdxBarButton.onClick事件。doThis是我在 TParent 类中声明并从 TChild 调用的自定义受保护虚拟过程。 -
您可以通过简单的网络搜索来回答这个问题。请不要认为 SO 取代了网络搜索。但它是完全没有意义的 postink 假代码。不要那样做。
-
BtnRefreshClick 显然是 btnRefresh 的事件处理程序,并且您正在使用表单继承。可以将 BtnRefreshClick 方法标记为虚拟(未经测试),或者您可以调用 btnRefresh.Click 来触发正确的事件处理程序。
-
@StefanGlienke :是的,它已经解决了。就像你说的那样打电话给
btnRefresh.click而不是btnRefreshClick(nil)。多谢。 @DavidHeffernan:那么很好,我将离开就 SO 提出问题,因为我的问题不足以在 SO 上显示。
标签: delphi overriding