Eiffel,多种类型一致性:一种指定参数是 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
继承自 PRINTER
和 DEVICE
和 MY_SCANNER
继承自 SCANNER
和 DEVICE
)。另一种方法是使用 ANY
作为类型,但这不是最好的解决方案。
如果特征 work
属于可能具有形式泛型参数的 class,则可以将其定义为采用相应形式泛型类型的一个参数:
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
也可以作为 class 功能声明和实现,则可以避免使用临时变量:
{X [like multi_function_device]}.work (multi_function_device)
如果辅助 class 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
有没有办法(我确定有运行时检查...)来指定参数或变量通常符合多种类型?避免做诸如
之类的事情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
继承自 PRINTER
和 DEVICE
和 MY_SCANNER
继承自 SCANNER
和 DEVICE
)。另一种方法是使用 ANY
作为类型,但这不是最好的解决方案。
如果特征 work
属于可能具有形式泛型参数的 class,则可以将其定义为采用相应形式泛型类型的一个参数:
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
也可以作为 class 功能声明和实现,则可以避免使用临时变量:
{X [like multi_function_device]}.work (multi_function_device)
如果辅助 class 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