Эйфелева, соответствие нескольких типов: способ указать, что параметр является потомком от A и B? - PullRequest
0 голосов
/ 28 июня 2019

Есть ли способ (я уверен, что есть проверка вне времени выполнения ...), чтобы указать, что параметр или переменная в целом соответствуют нескольким типам?чтобы избежать таких действий, как

work (a_printer: PRINTER; a_scanner: SCANNER)
    do
      a_printer.print
      a_scanner.scan
        -- OR without second parameter
      if attached {SCANNER} a_printer as l_scanner then
         l_scanner.scan
      else
         throw RuntimeError
      end
    end

Ответы [ 2 ]

1 голос
/ 29 июня 2019

Если признак 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
1 голос
/ 28 июня 2019

Я думаю, что, если возможно, вы должны использовать общего предка для ваших нескольких типов. Если вы не можете (если вы используете типы библиотек), вы можете создать классы-потомки (MY_PRINTER наследует от PRINTER и DEVICE и MY_SCANNER наследует от SCANNER и DEVICE). Другой способ - использовать ANY в качестве типа, но это не лучшее решение.

...