Eiffel: соответствие типов, как дать тип вместо экземпляра - PullRequest
0 голосов
/ 05 апреля 2019

Общая информация

Я не понимаю, почему существуют 2 generating_type вида, один с восклицательным знаком, а другой нет.

Мой случай

У меня есть функция, возвращающая DB_SERVICE[G] из данного экземпляра из коллекции db_services, чтобы из другого сервиса я мог получить его и вызвать.Когда я передаю экземпляр generating_type этой функции, conforms_to возвращает True, как когда я даю ({ENUMERATE}).generating_type, это не так.

Почему это так?

-- Humanly unreadable
if attached {ENUMERATE_DB_SERVICE} {SIT_ENVIRONMENT}.app_instance.db_service_from_entity_type (item_prototype.charge_unit_relationship.secondary_prototype.an_index_relationship.secondary_prototype.generating_type) as l_enum_dbs then

-- Humanly readable but not working
if attached {ENUMERATE_DB_SERVICE} {SIT_ENVIRONMENT}.app_instance.db_service_from_entity_type (({ENUMERATE}).generating_type) as l_enum_dbs then

Моя функция

db_service_from_entity_type (an_entity_type: TYPE[detachable DB_ENTITY]): detachable like db_services.item
    do
        across
            db_services as l_dbs
        until
            Result /= Void
        loop
            if l_dbs.item.item_prototype.generating_type.conforms_to (an_entity_type) then
                Result := l_dbs.item
            end
        end
    ensure
        service_found: attached Result
    end

Редактировать (20190405-11: 26 UTC)

Как показано на скриншоте, предоставление {ENUMERATE} вместо ({ENUMERATE}).generating_type также не работает

enter image description here

1 Ответ

1 голос
/ 05 апреля 2019

generating_type возвращает динамический тип объекта.Следовательно, ({ENUMERATE}).generating_type производит TYPE [!TYPE [!ENUMERATE]].Но вам нужно только TYPE [ENUMERATE].Это может быть достигнуто путем удаления вызова на generating_type и использования отсоединяемой версии типа: {detachable ENUMERATE}.

Соответствующий тест объекта будет выглядеть как

if attached {ENUMERATE_DB_SERVICE} {SIT_ENVIRONMENT}.app_instance.db_service_from_entity_type
    ({detachable ENUMERATE}) as l_enum_dbs then
...