如何让“继承”出现在我的程序结束而不是开始?

问题描述 投票:3回答:2

首先,我怀疑这是可能的,但如果是的话,我很想知道如何。我记得以前看过这种行为,但它可以在IDE中明确实现。

我有一个基本形式,然后我继承到各种其他形式。在基本形式中,我有许多虚拟方法,这些方法将被继承的表单覆盖和实现。

有些虚拟方法期望在程序结束时调用inherited。但是,默认情况下,它会在开头自动插入。这往往会引起混淆,特别是忘记在最后而不是从头开始调用它。

如果可能的话,我怎么能强迫inherited插入到最后而不是开头,如下所示?

procedure TMyForm.DoStuff;
begin

  inherited;
end;
delphi inheritance virtual-method
2个回答
6
投票

您无法更改IDE的此行为。

IDE知道某些方法,例如重写的析构函数,期望inherited语句出现在方法体的末尾。对于这样的方法,IDE确实在执行类完成时将inherited的调用放在方法体的末尾。但是没有任何机制可以让你告诉IDE其他方法,它什么都不知道,应该这样对待。


3
投票

要添加大卫的答案,如果您需要强制执行此操作顺序,最好的方法是更改​​设计。解耦之后需要发生的操作可以这样做:

type
  TMyBase = class
    protected
      DoBeforeSomething : procedure; virtual; abstract;
    public
      DoSomething : procedure;
  end;

  TMyCustom = class(TMyBase)
    protected
      DoBeforeSomething : procedure; override;
  end;

procedure TMyBase.DoSomething;
begin
  DoBeforeSomething;
  // Do common things now...
end;

procedure TMyCustom.DoBeforeSomething;
begin
  inherited;
  // some custom things...
end;

消费者总是会调用DoSomething方法来执行任何预期的操作,但是继承类会覆盖DoBeforeSomethingDoSomethingDoSomething中首先被调用,然后才需要进行其他操作。

这样,后代类不必担心重写inherited本身并在“错误”的地方调用qazxswpoi,类的设计负责以正确的顺序获取操作。

© www.soinside.com 2019 - 2024. All rights reserved.