Прежде всего, я сомневаюсь, что это вообще возможно, но если это так, я хотел бы знать, как это сделать. Я помню, что видел такое поведение раньше, но его можно было явно реализовать в среде IDE.

У меня есть базовая форма, которую я затем наследую в различные другие формы. В базовой форме у меня есть несколько виртуальных методов, которые должны быть переопределены и реализованы унаследованными формами.

Существуют определенные виртуальные методы, которые ожидают вызова inherited в конце процедуры. Однако по умолчанию он автоматически вставляется в начало . Это часто вызывает путаницу, особенно если вы забываете называть его в конце, а не в начале.

Как я могу заставить inherited вставляться в конец вместо начала , как показано ниже, если это вообще возможно?

procedure TMyForm.DoStuff;
begin

  inherited;
end;
3
Jerry Dodge 2 Янв 2018 в 18:26

2 ответа

Лучший ответ

Вы не можете изменить это поведение IDE.

IDE знает, что определенные методы, например переопределенные деструкторы, ожидайте, что оператор inherited появится в конце тела метода. Для таких методов среда IDE действительно помещает вызов inherited в конец тела метода при выполнении завершения класса. Но у вас нет механизма, чтобы сообщить IDE, что другие методы, о которых она ничего не знает, должны обрабатываться таким образом.

6
David Heffernan 2 Янв 2018 в 15:41

Чтобы добавить к ответу Дэвида, если вам нужно обеспечить соблюдение этого порядка операций, лучший способ сделать это - изменить дизайн. Разделение операций, которые должны произойти впоследствии, можно сделать примерно так:

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 в «неправильном» месте, дизайн класса заботится о том, чтобы операции выполнялись в правильном порядке.

3
J... 2 Янв 2018 в 21:47