В Delphi можно вызвать метод экземпляра метода класса с тем же именем?

Возможно ли, что в Delphi метод класса вызывает метод унаследованного экземпляра с тем же именем? Например, я попробовал что-то вроде этого:

//... Skipped surrounding class definitions
function TSomeAbstractDialogForm.Execute: Boolean;
begin
 Result := ShowModal = mrOk;
end;

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

class function TSomeInheritingDialogForm.Execute: Boolean;
var
 Fm: TSomeInheritingDialogForm;
begin
 Fm := TSomeInheritingDialogForm.Create(nil);
 try
 Result := Fm.Execute;
 finally
 Fm.Free;
 end
end;

Этот подход привел к бесконечному циклу, поскольку F.Execute вместо вызова метода предполагаемого экземпляра базового класса продолжал называть метод factory снова и снова (в результате получается куча созданных форм).

Конечно, очевидным решением было изменение имени метода factory (я назвал его CreateAndShow), но мне было любопытно. Почему компилятор не предупредил меня о скрытом методе? Есть ли способ явно вызвать метод экземпляра в такой ситуации?
3 ответа

Вы можете попробовать жесткий бросок. Но лучше переименовать функцию класса. (Например, CreateAndExecute).

Выполнение в дочернем классе скрывает выполнение в родительском классе (я думаю, что компилятор даст предупреждение для этого). Вы можете получить доступ к этому с помощью жесткого литья. Но нет способа различать метод экземпляра и метод класса.

function TSomeAbstractDialogForm.Execute: Boolean;
begin
 Result := ShowModal = mrOk;
end;
class function TSomeInheritingDialogForm.Execute: Boolean;
var
 Fm: TSomeInheritingDialogForm;
begin
 Fm := TSomeInheritingDialogForm.Create(nil);
 try
 Result := TSomeAbstractDialogForm(Fm).Execute;
 finally
 Fm.Free;
 end
end;


Результат: = inherited Execute не будет выполняться, так как он вызывается в созданной переменной, а не в методе класса.

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


Не будет ли

Result := inherited Execute;

сделать трюк?

licensed under cc by-sa 3.0 with attribution.