Эйфель: Как мне сравнить тип объекта с заданным типом?

Как сравнить тип объекта с заданным типом (оператор instanceOf в Java)?

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

person Pipo    schedule 26.10.2018    source источник


Ответы (2)


В зависимости от общности решения возможны разные варианты. Во-первых, рассмотрим случай, когда 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
person Alexander Kogtenkov    schedule 26.10.2018

Если вы хотите проверить, идентичен ли тип 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
person javierv    schedule 26.10.2018
comment
Функции same_type и conforms_to предполагают объект в качестве аргумента, а не тип. Другими словами, они сравнивают типы двух объектов, а не тип объекта с каким-либо другим типом. Например, ("").same_type ({STRING}) дает False, а ("").same_type ("") дает True. В исходном вопросе даны только объект и тип, а не два объекта. - person Alexander Kogtenkov; 27.10.2018