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

时间:2018-01-02 15:26:57

标签: delphi inheritance virtual-method

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

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

某些虚拟方法希望在过程的 end 中调用inherited。但是,默认情况下,它会自动插入开头。这往往会引起混淆,特别是忘记在最后而不是在开始时调用它。

如果可能的话,我如何强制inherited插入 end 而不是开头,如下所示?

procedure TMyForm.DoStuff;
begin

  inherited;
end;

2 个答案:

答案 0 :(得分:6)

您无法更改IDE的此行为。

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

答案 1 :(得分:3)

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

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方法来执行任何预期的操作,但是继承类会覆盖DoBeforeSomething,这在DoSomething之前被调用,然后才需要执行其他操作完成。

这样,后代类不必担心覆盖DoSomething本身并在“错误”位置调用inherited,该类的设计负责将操作置于正确的位置顺序。