Eiffel:有没有一种方法可以为参数指定各种类型

时间:2018-10-11 12:24:25

标签: eiffel conform

有没有一种方法可以将类型的一致性限制为类型的集合?

让我通过示例进行解释:

[Sensor,    Date,            Temperature]
[Sensor1,   <datetime1>,     <temp1>    ]
[Sensor2,   <datetime2>,     <temp3>    ]
[Sensor1,   <datetime3>,     <temp2>    ]
[Sensor2,   <datetime4>,     <temp4>    ]

我不能做类似的事情(就像转换函数可以做的那样)

give_foo (garbage: ANY): STRING
    do
        if attached {STRING} garbage as l_s then
            Result := l_s
        elseif attached {INTEGER} garbage as l_int then
            Result := l_int.out
        elseif attached {JSON_OBJECT} garbage as l_int then
            Result := l_int.representation
        elseif attached {RABBIT} garbage as l_animal then
            Result := l_animal.name + l_animal.color
        else
            Result := ""
            check
                unchecked_type_that_compiler_should_be_able_to_check_for_me: False
            end
        end
    end

或类似的

give_foo (garbage: {STRING, INTEGER, JSON_OBJECT, RABBIT}): STRING
    do
        if attached {STRING} garbage as l_s then
            Result := l_s
        elseif attached {INTEGER} garbage as l_int then
            Result := l_int.out
        elseif attached {JSON_OBJECT} garbage as l_int then
            Result := l_int.representation
        elseif attached {RABBIT} garbage as l_animal then
            Result := l_animal.name + l_animal.color
        else
            Result := ""
            check
                unchecked_type_that_compiler_should_be_able_to_check_for_me: False
            end
        end
    end

2 个答案:

答案 0 :(得分:1)

不支持符合类型集合的原因如下:

  • 在这种类型的表达式上调用功能变得模棱两可,因为相同的名称可能表示完全不相关的功能。
  • 在一种情况下,我们需要类型的总和(不相交并集),第二种是-纯联合,第三种是-交集,等等。然后,可能会有组合。人们可能需要在过于复杂的类型系统之上构建代数。
  • 如果要求检查参数是否为预期类型之一,则可以使用以下前提条件:

    across {ARRAY [TYPE [detachable ANY]]}
            <<{detachable STRING}, {INTEGER}, {detachable JSON_OBJECT}>> as t
    some argument.generating_type.conforms_to (t.item) end
    
  • 处理潜在未知类型的表达式的一种常见做法是访问者模式,该模式处理已知案例并回落为未知案例的默认值。

答案 1 :(得分:1)

是否可能将Alexander的解决方案放在BOOLEAN查询中,以便可以重用?

is_string_integer_or_json_object (v: detachable ANY): BOOLEAN
         -- Does `v' conform to {STRING}, {INTEGER}, or {JSON_OBJECT}?
    do
       across {ARRAY [TYPE [detachable ANY]]}
        <<{detachable STRING}, {INTEGER}, {detachable JSON_OBJECT}>> as t
       some v.generating_type.conforms_to (t.item) end
    end