繁体   English   中英

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

[英]Eiffel: Creator instruction applies to target of a deferred type

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 Error的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编译器的限制? 如果是的话,最佳做法是什么?

一种可能的解决方案是使用泛型类。 在类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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM