deferred class ANIMAL
inherit
ANY
redefine
default_create
end
feature
creator: like Current
guts: GUTS
default_create
do
create guts
end
make_malformed
do
default_create
end
end --class
class PIG
inherit
ANIMAL
redefine
make_malformed
end
create
default_create,
make_malformed,
make_from_insemination
feature
guts: GUTS
make_malformed
do
Precursor
set_left_eye (create {MALFORMED_EYE})
end
make_from_insemination (some_humain: HUMAIN)
do
default_create
creator := some_humain
end
end --class
在我的最佳实践愿景中,我会说
make_malformed
示例),请重新定义default_create
default_create
并添加特定行为(例如我的make_from_db
示例)make
之类的create {LINKED_LIST}.make
如果我错了,请纠正我。预先感谢!
答案 0 :(得分:1)
在将default_create
以相应的语义添加到ANY
之前,已经开发了许多Eiffel库。这解释了为什么基础库的许多类都不使用它。
此外,创建过程可以带有一些特定含义。例如,make
可以创建一个使用引用相等性比较内部对象的容器,而make_equal
可以创建一个使用对象相等性的容器(HASH_TABLE
就是这种情况,尽管有一个附加参数来表示预期的元素数量,可以使用其他一些设计选择来省略此参数)。在这种情况下,default_create
和default_create_equal
将是非对称的,而make
和make_equal
是对称的,因此设计更加一致。
正如您所指出的,default_create
不应带有任何后代期望的任何特定行为,而只是某些基本行为。
所有其他创建过程是否应调用default_create
很大程度上取决于设计。一个几乎是规则的示例是库“ vision” ,该库以default_create
编码正确的初始化顺序,这对无效性至关重要。仍然有可能编写一个类(基于该库)以正确执行初始化,而无需在其创建过程中调用default_create
,但具有易于遵循的模式可以简化开发。