埃菲尔:如何比较对象的类型和给定的类型?

时间:2018-10-26 17:57:04

标签: eiffel

如何将对象的类型与给定类型(Java中的instanceOf语句)进行比较?

do_stuff (a_type: TYPE)
    local
        an_object: ANY
    do
        an_object := get_from_sky
        if an_object.instanceOf (a_type) then
            io.putstring("Object is same type as parameter")
        else
            io.putstring("Object is NOT same type as parameter")
        end
    end

2 个答案:

答案 0 :(得分:1)

根据解决方案的一般性,有不同的选择。首先,考虑始终附加an_object的情况:

  1. a_type始终表示引用类型。

    对于引用类型,可以使用类attempted的功能/(具有别名TYPE)。

    if attached (a_type / an_object) then
        -- Conforms.
    else
        -- Does not conform.
    end
    
  2. a_type可以表示引用类型或扩展类型。

    在这种情况下,类attempted的功能TYPE不可用,因为它始终会为扩展类型返回附加的对象。因此,应直接比较类型。

    if an_object.generating_type.conforms_to
        (({REFLECTOR}.type_of_type ({REFLECTOR}.detachable_type (a_type.type_id))))
    then
        -- Conforms.
    else
        -- Does not conform.
    end
    

如果an_object也可以是Void,则该条件应进行其他空缺测试。从上述C的情况来看,处理可拆卸an_object的测试将是:

if
        -- If an_object is attached.
    attached an_object and then C or else
        -- If an_object is Void.
    not attached an_object and then not a_type.is_attached
then
    -- Conforms.
else
    -- Does not conform.
end

答案 1 :(得分:-1)

如果您要检查a_type的类型是否与an_object的类型相同, 使用功能{ANY}.same_type,如果要检查类型一致性,只需使用{ANY}.conforms_to

do_stuff (a_type: TYPE)
    local
        an_object: ANY
    do
        an_object := get_from_sky
        if an_object.same_type (a_type) then
             io.putstring("Object an_object is same type as argment a_type")
        elseif an_object.conforms_to (a_type)
             io.putstring("Object an_object conforms to type of a_type ")
        else
             io.putstring ("...")  
        end
    end