Хотя в большей степени вопрос о языке 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 суперкласса, даже если он будет повторно введен, не приведет к выполнению кода подкласса.
Как можно обойти такие ограничения / ограничения в используемых классах, чтобы достичь того, что указано в псевдокоде выше?