埃菲尔铁塔:创建者指令适用于延迟类型的目标

时间:2018-09-26 14:45:49

标签: eiffel

A级

deferred Class A

feature -- 

    item: X -- X is deferred

    set_item_for_some_reason (param: N)
        do
            create item.make_from_param (param)
        end

end -- class

B级

Class B inherit

    A

feature -- 

    item: Y -- Y not deferred inherits from X

end -- class

我想在同一个类中创建一个将在后代中定义的属性,并得到一个Creator instruction applies to target of a deferred type错误,该错误会以一种简化的上下文形式出现,但不是在我打算的上下文中做吧。

对我来说,能够在当前的延迟类中创建对象确实很有意义,我将不必在所有后代中实现!这将是一个错误的设计...类似这样:

deferred Class A

feature -- 

    item: X -- X is deferred

    set_item_for_some_reason (param: N)
        do
            set_item_from_param (param)
        end

    set_item_from_param (param: N)
        deferred
        end

end -- class


Class B inherit

    A

feature -- 

    item: Y -- Y not deferred


    set_item_from_param(param: N)
        do
            create item.make_from_param (param)
        end

end -- class

我对我的设计有误吗?还是关于Eiffel编译器as I understood的限制在讨论中?如果是的话,最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

一个可能的解决方案是使用泛型类。在类A中,形式通用参数具有创建约束,即相应的实际通用参数应具有特定的创建过程:

class A [G -> X create make_from_param end] feature
    item: detachable G
    set_item_for_some_reason (param: N)
        do
            create item.make_from_param (param)
        end
end

后代类可以指定具有以下创建过程的实际泛型:

class B inherit
    A [Y]
end

为确保我们在同一页面上,以下是类XY的代码:

deferred class X feature
    make_from_param (param: N)
        deferred
        end
end

class Y inherit
    X
create
    make_from_param
feature
    make_from_param (param: N)
        do
        end
end

您可以根据需要添加任意多个后代。主要限制是,每当使用类A时,其实际通用参数应具有指定的功能作为创建功能。例如,可以声明类型A [Y]。但是A [X]会触发错误。

如果在后代中,item的类型尚不固定,则可以传播它,并重复对形式泛型的约束:

class C [G -> X create make_from_param end] inherit
    A [G]
end