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
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的限制在讨论中?如果是的话,最佳做法是什么?
答案 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
为确保我们在同一页面上,以下是类X
和Y
的代码:
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