Eiffel: правильный способ наследования от класса и преобразования объекта Current в него.

Я не в первый раз пытаюсь наследоваться от класса и преобразовывать в него объект, в этом случае расширять функциональные возможности HTTP_CLIENT_RESPONSE с помощью valid_http_response => response.status = 200, valid_http_json_body => validate json content и т. д.

Для этого я хотел бы унаследовать от HTTP_CLIENT_RESPONSE и добавить функции и создать свой собственный DB_ENTITY_HTTP_CLIENT_RESPONSE из HTTP_CLIENT_RESPONSE

test_case
    local
        l_http_client_r: HTTP_CLIENT_RESPONSE
        l_db_entity_http_client_r: DB_ENTITY_HTTP_CLIENT_RESPONSE
    do
        l_http_client_r := execute_get("someURL") -- returns an HTTP_CLIENT_RESPONSE
        l_db_entity_http_client_r := l_http_client_r
        assert("valid response", l_db_entity_http_client_r.valid_response)
    end

кажется, у меня возникли трудности с установкой внутренних свойств... как лучше всего это сделать? У меня был такой же случай, когда я пытался создать класс WATT, наследующий от NATURAL_32, который является расширенным.

В моей стратегии я пытался вызвать создателя

  • процедура создания родителя
  • затем позвоните в deep_copy

Вот остальная часть моей попытки класса:

class
    DB_ENTITY_HTTP_CLIENT_RESPONSE

inherit
    HTTP_CLIENT_RESPONSE

create
    make_from_http_client_response

convert
    make_from_http_client_response ({HTTP_CLIENT_RESPONSE})

feature -- Initialization

    make_from_http_client_response (a_client_response: HTTP_CLIENT_RESPONSE)
        do
            make (a_client_response.url)
            deep_copy (a_client_response)
        end

feature -- Status report

    valid_response: BOOLEAN
        do
            Result := status = 200
        end

Единственный способ, которым я нашел работу на данный момент, - это установить все атрибуты на другие, что обычно является семантикой deep_copy...

make_from_http_client_response (a_client_response: HTTP_CLIENT_RESPONSE)
    do
        make (a_client_response.url)
        set_body (a_client_response.body)
        set_http_version (a_client_response.http_version)
        set_error_occurred (a_client_response.error_occurred)
        set_error_message (a_client_response.error_message)
        set_raw_header (a_client_response.raw_header)
        set_status_line (a_client_response.status_line)
        ... I surely forgot something...
    end

person Pipo    schedule 05.02.2019    source источник
comment
Не могли бы вы объяснить дизайнерские решения или привести конкретный пример, пожалуйста? Как уже говорилось, неясно, чего вы пытаетесь достичь.   -  person Alexander Kogtenkov    schedule 05.02.2019
comment
@AlexanderKogtenkov Надеюсь, редактирование поможет...   -  person Pipo    schedule 06.02.2019


Ответы (1)


Нет встроенной функции для инициализации объекта одного типа из объекта другого типа. Функции copy и deep_copy ожидают объекты одного и того же типа. Поэтому установка атрибутов явно в коде — это путь.

Другой альтернативой является использование отношений клиент-поставщик вместо наследования. Подходит ли это, зависит от приложения.

person Alexander Kogtenkov    schedule 11.02.2019