Eiffel:多个通用约束上的语法错误

时间:2019-07-19 14:37:30

标签: eiffel

根据this documentation,我正在尝试将通用参数限制为2个类,并且在实现中需要一个default_create创建过程调用。

我从Syntax error子句的编译器中获得了select。为什么会这样?

我首先想到了调用default_create会调用G,这可能是合并/重命名/等。但似乎在该级别上我必须同时调用这两者之一或两者都重命名,这对我来说很有意义。但是为什么这种语法会失败?

上下文和我的代码如下:

deferred class
    IDENTIFIABLE_CASH[G -> {IDENTIFIABLE[ANY],
                            DB_ENTITY select default_create end} create default_create end]

inherit
    DB_SERVICE_CASH[G]


feature -- Access

    cash_from_identifier (an_identifier: like {IDENTIFIABLE_DB_ENTITY[ANY]}.identifier): G
            -- Returns firt entity found like given an_identifier (like operator is used)
        local
            l_qry: COMPOSED_SQL_QUERY
        do
            across
                cash is l_item
            loop
                if l_item.identifier.is_equal(an_identifier) then
                    Result := l_item
                end
            end
            if not attached Result then
                create l_qry.make (item_prototype)
                l_qry.add_constraint (create {FIELD_CONSTRAINT}.make (Void, identifier_db_column_name, {CONSTRAINT}.Like_operator, an_identifier))
                load_entities (l_qry)
                if items.count > 0 then
                    Result := items.first
                else
                    create Result
                    check
                        item_not_found: False
                    end
                end

                cash.extend (Result)
            end
        end

1 个答案:

答案 0 :(得分:1)

page声明select子句不是标准的一部分,而应使用rename。换句话说,为两个约束类中的至少一个重命名default_create就足够了,并使用该功能的一个版本,例如default_create

G -> {IDENTIFIABLE[ANY], DB_ENTITY rename default_create as d end}
     create default_create end

在上述情况下,可以使用Resultcreate Result创建create Result.default_create。第二个版本也可以使用:

G -> {IDENTIFIABLE[ANY], DB_ENTITY rename default_create as d end}
     create d end

现在只能使用Result创建create Result.d。最后,可以列出两个创建过程:

G -> {IDENTIFIABLE[ANY], DB_ENTITY rename default_create as d end}
     create default_create, d end

最后一个变体允许使用create Result.default_createcreate Result.d