Eiffel: создать во время выполнения типизированный объект - PullRequest
0 голосов
/ 29 октября 2018

Попытка создать объект, который решается @runtime. У меня похожая ситуация:

class ZOO

feature

    animals: LINKED_LIST[ANIMAL]

    default_create
        do
            create animals.make
            animals.extend(create {LION})
            animals.extend(create {SERPENT})
            animals.extend(create {BIRD})
        end

    open
        local
            l_sector: ZOO_SECTOR[ANIMAL]
        do
            across
                animals as animal
            loop
                create {ZOO_SECTOR[animal.item.generating_type]} l_sector
            end
        end

на create {ZOO_SECTOR[animal.item.generating_type]} l_sector компилятор не согласен со мной, я пробовал с l_type: TYPE[ANIMAL] и create {ZOO_SECTOR[l_type]} l_sector, который не работает ни один. Я обязан сделать что-то подобное? что будет для меня противоречием с гибкостью полиморфизма, я думаю, что мне не хватает механизма / утверждения

open
    local
        l_sector: ZOO_SECTOR[ANIMAL]
    do
        across
            animals as animal
        loop
            if attached {LION} animal.item then
                create {ZOO_SECTOR[LION]} l_sector
            else if attached {SERPENT} animal.item then
                create {ZOO_SECTOR[SERPENT]} l_sector
            else
                .....
        end
    end

1 Ответ

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

Система типов Eiffel опирается на структуру класса, а структура класса фиксируется во время компиляции. Может быть возможно добавлять типы динамически (например, должно быть возможно придумать решение с использованием отражения), но это не может быть выражено напрямую в самом языке.

Если животному разрешено знать свой сектор зоопарка, типы ZOO_SECTOR могут быть закодированы непосредственно в классе животных:

class ANIMAL feature ...
    sector: ZOO_SECTOR [like Current] do create Result end
end

Из-за использования like Current нет необходимости добавлять новый код в потомки. Цикл из примера станет

across
    animals as animal
loop
    l_sector := animal.item.sector
end

дает ZOO_SECTOR [LION] для элемента типа LION и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...