Eiffel: инструкция создателя применяется к цели отложенного типа - PullRequest
0 голосов
/ 26 сентября 2018

Класс A

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

Класс B

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 , как я понял ?и если да, то каков наилучший метод обхода?

1 Ответ

0 голосов
/ 26 сентября 2018

Возможное решение - использовать универсальные классы.В классе 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
...