埃菲尔铁塔:类型一致性,如何赋予类型而不是实例

时间:2019-04-05 10:46:59

标签: eiffel

常规

我不明白为什么会有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 个答案:

答案 0 :(得分:1)

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