Eiffel: недопустимое ограничение для формального универсального параметра - PullRequest
0 голосов
/ 19 октября 2018

Следуя странным шаблонам для некоторых, я не могу этого сделать?Компилятор говорит Invalid constraint for formal generic parameter

class PARENT[G -> CHILD[like Current]]

feature -- Access

    children: LIST[G]

end

class CHILD[H -> PARENT[like Current]]

feature -- Access

    father: H
end

, чтобы иметь возможность сделать что-то вроде

class WIDOW_PARENT

inherit
    PARENT[BLACK_CHILD]

end

class BLACK_CHILD

inherit 
    CHILD[WIDOW_PARENT]

end

Если я не сделаю это с универсальностью, мне придется переопределить коллекцию детейот

  • children: LIST[CHILD] до children: LIST[BLACK_CHILD] в класс WIDOW_PARENT
  • father: PARENT до father: WIDOW_PARENT в класс BLACK_CHILD

вместо толькоукажите это в предложении наследования ... Надеюсь, это имеет смысл

Обновление

Когда я решил это с ответом Александера, я застрял дальше, делая проверку соответствия.Я пытаюсь установить HTTP-маршрутизатор в зависимости от сущностей, и если это дочерняя сущность, она должна иметь возможность http://host:port/entity/child_entity/id, чтобы получить все дочерние сущности от сущности.Для этого я хотел бы добавить в общий маршрутизатор чек.На что-то вроде ANY_PARENT_DB_ENTITY, например

if ({G}).conforms_to ({CHILD_DB_ENTITY[ANY_PARENT_DB_ENTITY]}) then
    friend.act_like_a_father 
else
    friend.act_like_a_mate
end

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Будучи лучшим решением для меня, единственное решение для всего моего шаблона - переопределить в моем классе маршрутизатора метод set_handler с помощью

CHILD_DB_ENTITY

deferred class
    CHILD_DB_ENTITY[H -> PARENT_DB_ENTITY[CHILD_DB_ENTITY[H]]]

inherit
    DB_ENTITY

feature 

    parent: H

ENTITY_HANDLER

ENTITY_HANDLER[G -> DB_ENTITY, H -> DB_SERVICE[G] create make end]

feature

        item_prototype: detachable G

        set_handler
            do
                setting_url_("http://host:port/" + {like item_prototype}.out)
                ...
            end
end -- Class

CHILD_ENTITY_HANDLER

CHILD_ENTITY_HANDLER[G -> CHILD_DB_ENTITY[PARENT_DB_ENTITY[G]], H -> DB_SERVICE[G]]

inherit
    ENTITY_HANDLDER
        redefine
            set_handler
        end

feature

        set_handler
            do
                Precursor
                setting_url_("http://host:port/" + ({like item_prototype}).out + "/" + ({like item_prototype.parent}).out + "/{id}")
            end

end -- Class

PARENT_ENTITY_HANDLER

PARENT_ENTITY_HANDLER[G -> PARENT_DB_ENTITY[CHILD_DB_ENTITY[G]], H -> DB_SERVICE[G]]

inherit
    ENTITY_HANDLDER
        redefine
            set_handler
        end

feature

        set_handler
            do
                Precursor
                setting_url_("http://host:port/" + ({like item_prototype}).out + "/" + ({like item_prototype.children.item}).out + "/{id}")
                -- children being a LINKED_LIST[PARENT_DB_ENTITY]
            end

end -- Class

Я надеялся, что есть способ получить его с полиморфизмом в том же классе, но также имеет смысл иметьпереопределить это таким образом ...

0 голосов
/ 20 октября 2018

В современном Eiffel привязанные типы не могут использоваться в формальных общих ограничениях, поэтому это ошибка.Все еще возможно иметь взаимные ограничения, явно повторяя типы классов:

class PARENT [G -> CHILD [PARENT [G]]]
class CHILD  [H -> PARENT [CHILD [H]]]

С этим изменением пример компилируется.

...