Общее правило для унаследованных утверждений следующее:
- предварительные условия могут быть только ослаблены;
- постусловия могут быть только усилены.
In В конкретном примере эффективным предварительным условием является
True
or else
valid_csv (a_csv) and then attached {POWER_DEVICE} a_csv.device
Это отражено ключевыми словами require
в начале и require else
в середине комбинированного предварительного условия в плоской форме функции. Выражение True
передается по наследству. Это предварительное условие для функции в родительском элементе.
Возможное решение - переместить valid_csv (a_csv)
в родительский элемент и переопределить valid_csv
в потомке. Если valid_csv
является общим для всех вызовов, но второй тест различается для потомков, может быть лучше ввести новую функцию is_known
и иметь 2 подпункта предварительного условия в родительском:
is_valid_csv: is_valid_csv (a_csv)
is_known_csv: is_known_csv (a_csv)
Реализация из is_known_csv
в классе POWER_CSV_PROCESSOR
будет
is_known_csv (a_csv: ...)
do
Result := attached {POWER_DEVICE} a_csv.device
end
, а предварительное условие функции process
в POWER_CSV_PROCESSOR
будет пустым.
Затем вызывающий абонент сделает что-то вроде
if processor.is_known_csv (csv) then
processor.process (csv)
end