Delphi, улучшить код не виртуальных методов или событий - PullRequest
1 голос
/ 28 мая 2020

Хотя в большей степени вопрос о языке Delphi, мы будем использовать конкретный пример c, чтобы попытаться лучше понять идею:

используя TWebModule Delphi для HTTP-сервера, мы можем определить конечные точки как действия и назначить этим действиям событие OnAction для выполнения кода при запросе к данной конечной точке.

многие, если не большинство из этих действий, требуют авторизации: то есть все они начинаются с тот же блок кода, который проверяет действительные учетные данные и решает, разрешить ли выполнение запроса или нет. Итак, я начал искать, как можно «сгруппировать» набор похожих действий, возможно, в подкласс класса действий по умолчанию (TWebActionItem), который добавляет код авторизации c. Также может потребоваться выполнить некоторые общие c методы до / после.

псевдокод будет выглядеть примерно так, где TAuthWebActionItem является подклассом TWebActionItem, добавляющим код авторизации, и до / после вызовов методов:

function TAuthWebActionItem.OnAction 
begin
  FBeforeAction // execute some initialization code
  if authorized then // auth ok?
    inherited // proceed
  else
    'you are not authorized'
  FAfterAction // execute some finalization code
end

затем мы создадим TAuthWebActionItem, добавим его в список действий TWebModule, и все готово.

однако классы TWebModule и TWebActionItem не предлагают виртуальных методов для переопределения . Использование «reintroduce» вместо «override» также не решит эту проблему, поскольку элементы списка действий TWebModule по-прежнему относятся к типу TWebActionItem: вызов OnAction суперкласса, даже если он будет повторно введен, не приведет к выполнению кода подкласса.

Как можно обойти такие ограничения / ограничения в используемых классах, чтобы достичь того, что указано в псевдокоде выше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...