Eiffel: правильный способ наследования от класса и преобразования в него объекта Current - PullRequest
0 голосов
/ 05 февраля 2019

Я не первый раз пытаюсь унаследовать от класса и преобразовать в него объект, в этом случае расширить функциональность 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

1 Ответ

0 голосов
/ 11 февраля 2019

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

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

...