埃菲尔铁塔(Eiffel):从类继承并将Current对象转换为它的正确方法

时间:2019-02-05 18:37:34

标签: inheritance eiffel

这不是我第一次尝试从类继承并将对象转换为它,在这种情况下,将HTTP_CLIENT_RESPONSE的功能扩展为valid_http_response => response.status = 200valid_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

似乎我很难设置内部属性...什么是最好的方法?在尝试创建继承自NATURAL_32的WATT类时,我遇到了相同的情况。

在我的策略中,我尝试致电创建者

  • 父创建过程
  • 然后致电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 :(得分:1)

没有从另一种类型的对象初始化一种类型的对象的内置功能。功能copydeep_copy期望使用相同类型的对象。因此,在代码中显式设置属性是正确的方法。

另一种替代方法是采用客户-供应商关系而不是继承。是否合适取决于应用程序。