Eiffel: изменить подпись унаследованного объекта - PullRequest
0 голосов
/ 12 января 2019

Как правильно изменить подпись функции в Eiffel, если таковая имеется? если нет никакой опции, как я понял, как правильно определить в родительском классе, что будет возможность выбирать, но все еще не будет знать число и типы аргументов (типы можно разрешить с помощью полиморфизма .. .)

Единственная доступная игра с полиморфизмом, имеющая аргумент в классе a для выбора типа ЛЮБОЙ?

класс SELECTABLE

class SELECTABLE

    select
        deferred 
        end

end -- class

класс DB_SERVICE

class DB_SERVICE

inherit
    SELECTABLE
        (...)

feature -- Status setting


    select (a_db_connection: DB_CONNECTION)
        local
            l_qry: STRING
        do
            item := first_item_from_qry (l_qry)
        end

end -- class

1 Ответ

0 голосов
/ 13 января 2019

Наличие в классе SELECTABLE действительно является решением:

select (a: ANY)
    deferred
    end

Другое решение заключается в использовании TUPLE:

select (a: TUPLE)
    deferred
    end

Это позволяет вам иметь более одного аргумента в классах-потомках:

select (a: TUPLE [db_connection: DB_CONNECTION])
    do
        a.db_connection.do_something
    end

, который можно назвать:

a_db_server.select (a_db_connection)

или

select (a: TUPLE [db_connection: DB_CONNECTION; db_parameters: DB_PARAMETERS])
    do
        a.db_connection.do_something (a.db_parameters)
    end

который можно назвать:

a_db_server.select (a_db_connection, a_dp_parameters)

Обратите внимание, что в этом случае необходимость явной записи кортежа [...] в аргументе select является необязательной.

И, конечно же, select - это ключевое слово в Eiffel. Вам нужно будет использовать другое имя для вашей функции.

...