繁体   English   中英

埃菲尔铁塔,多种类型的一致性:一种指定参数是A和B的后代的方法吗?

[英]Eiffel, multiple types conformance: a way to specify that a parameter is a descendent from A and B?

有没有一种方法(我确定没有运行时检查...)来指定一个参数或一个变量通常符合多种类型? 避免做诸如

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

我认为,如果可能的话,您应该对多种类型使用共同的祖先。 如果不能(如果使用库类型),则可以创建后代类( MY_PRINTER继承自PRINTERDEVICEMY_SCANNER继承自SCANNERDEVICE )。 另一种方法是使用ANY作为类型,但这不是最佳解决方案。

如果要素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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM