Eiffel: инструкция Creator применяется к цели отложенного типа

Класс А

deferred Class A

feature -- 

    item: X -- X is deferred

    set_item_for_some_reason (param: N)
        do
            create item.make_from_param (param)
        end

end -- class

Класс Б

Class B inherit

    A

feature -- 

    item: Y -- Y not deferred inherits from X

end -- class

Я хотел бы создать в том же классе атрибут, который будет определен в потомке, и получить ошибку Creator instruction applies to target of a deferred type, которая имеет смысл в сокращенном контексте, но не в том контексте, в котором я намереваюсь это сделать.

Для меня имеет смысл иметь возможность создать объект в текущем отложенном классе, мне не нужно будет реализовывать его во всех потомках! что будет неправильным дизайном... что-то вроде этого:

deferred Class A

feature -- 

    item: X -- X is deferred

    set_item_for_some_reason (param: N)
        do
            set_item_from_param (param)
        end

    set_item_from_param (param: N)
        deferred
        end

end -- class


Class B inherit

    A

feature -- 

    item: Y -- Y not deferred


    set_item_from_param(param: N)
        do
            create item.make_from_param (param)
        end

end -- class

Я ошибаюсь в своем дизайне или это ограничение, которое все еще обсуждается в отношении компилятора Eiffel как я понял? и если да, то каков наилучший обходной путь?


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


Ответы (1)


Возможным решением является использование универсальных классов. В классе A формальный универсальный параметр имеет ограничение создания, согласно которому соответствующий фактический универсальный параметр должен иметь определенную процедуру создания:

class A [G -> X create make_from_param end] feature
    item: detachable G
    set_item_for_some_reason (param: N)
        do
            create item.make_from_param (param)
        end
end

Класс-потомок может указать фактический дженерик, который имеет следующую процедуру создания:

class B inherit
    A [Y]
end

Чтобы убедиться, что мы находимся на одной странице, вот код классов X и Y:

deferred class X feature
    make_from_param (param: N)
        deferred
        end
end

class Y inherit
    X
create
    make_from_param
feature
    make_from_param (param: N)
        do
        end
end

Вы можете добавить столько потомков, сколько пожелаете. Основное ограничение заключается в том, что всякий раз, когда используется класс A, его фактический общий параметр должен иметь указанную функцию в качестве функции создания. Например, можно объявить тип A [Y]. Но A [X] вызовет ошибку.

Если в потомке тип item еще не должен быть зафиксирован, его можно распространить, повторив ограничение на формальный дженерик:

class C [G -> X create make_from_param end] inherit
    A [G]
end
person Alexander Kogtenkov    schedule 26.09.2018
comment
ты босс! Я склонен не использовать универсальность, когда я могу использовать наследование, но вы правы, я должен пересмотреть свою теорию универсальности и случаев применения... Я стремлюсь использовать ее больше на языках с большим количеством ограничений в качестве реализаций и без полиморфизма в качестве обходных путей. . - person Pipo; 27.09.2018