Если признак work
принадлежит классу, который может иметь формальные универсальные параметры, его можно определить как получение одного аргумента соответствующего формального универсального типа:
class X [D -> {PRINTER, SCANNER}] feature
work (device: D)
do
device.scan
device.print
end
end
Затем на сайте вызывающей стороныможно сделать вызов
x.work (multi_function_device)
, где x
имеет соответствующий тип, например X [MULTI_FUNCTION_PRINTER]
.
Если work
также может быть объявлен и реализован как функция класса,временную переменную можно избежать:
{X [like multi_function_device]}.work (multi_function_device)
Если вспомогательный класс X
не является опцией, текущая версия языка не предоставляет средств для объявления аргумента как соответствующего более чем одному типу (например,work (d: {PRINTER, SCANNER})
), поэтому вам придется прибегнуть к предварительным условиям, таким как
work (p: PRINTER)
require
attached {SCANNER} p
do
check
from_precondition: attached {SCANNER} p as s
then
s.scan
end
p.print
end