Eiffel:Creator 指令适用于延迟类型的目标
Eiffel: Creator instruction applies to target of a deferred type
Class一个
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
Class B inherit
A
feature --
item: Y -- Y not deferred inherits from X
end -- class
我想在同一个 class 中创建一个属性,该属性将在后代中定义并得到一个 Creator instruction applies to target of a deferred type
错误,它以减少上下文的方式产生意义,但不是我打算这样做的上下文。
对我来说,能够在当前延迟 class 中创建对象确实有意义,我不必在所有后代中实现!这将是一个错误的设计......像这样:
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?如果是,最佳实践解决方法是什么?
一种可能的解决方案是使用通用 classes。在classA
中,形式泛型参数有一个创建约束,对应的实际泛型参数应该有一个特定的创建过程:
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 可以指定具有此创建过程的实际泛型:
class B inherit
A [Y]
end
为确保我们在同一页面上,这里是 classes 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
您可以根据需要添加任意数量的此类后代。主要限制是每当使用 class A
时,其实际泛型参数应具有指定的特征作为创建特征。比如声明一个类型A [Y]
就可以了。但是 A [X]
会触发错误。
如果在后代中,item
的类型还没有固定,可以传播它,重复对正式泛型的约束:
class C [G -> X create make_from_param end] inherit
A [G]
end
Class一个
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
Class B inherit
A
feature --
item: Y -- Y not deferred inherits from X
end -- class
我想在同一个 class 中创建一个属性,该属性将在后代中定义并得到一个 Creator instruction applies to target of a deferred type
错误,它以减少上下文的方式产生意义,但不是我打算这样做的上下文。
对我来说,能够在当前延迟 class 中创建对象确实有意义,我不必在所有后代中实现!这将是一个错误的设计......像这样:
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?如果是,最佳实践解决方法是什么?
一种可能的解决方案是使用通用 classes。在classA
中,形式泛型参数有一个创建约束,对应的实际泛型参数应该有一个特定的创建过程:
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 可以指定具有此创建过程的实际泛型:
class B inherit
A [Y]
end
为确保我们在同一页面上,这里是 classes 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
您可以根据需要添加任意数量的此类后代。主要限制是每当使用 class A
时,其实际泛型参数应具有指定的特征作为创建特征。比如声明一个类型A [Y]
就可以了。但是 A [X]
会触发错误。
如果在后代中,item
的类型还没有固定,可以传播它,重复对正式泛型的约束:
class C [G -> X create make_from_param end] inherit
A [G]
end