Eiffel:创建者指令适用于延迟类型的目标



Class 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 编译器的限制? 如果是,最佳实践解决方法是什么?

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

最新更新