埃菲尔:创建可重新定义的最佳方式 "constant"
Eiffel: best way to create a redefinable "constant"
如 所述,无法定义我可以重新定义为后代的常量。
在我的许多情况下,我希望有一个可以重新定义的常量。我认为 避免在每次咨询时创建 没有意义的替代方案是
那不行
class A
feature -- Access
Default_value: STRING = "some A value"
end -- Class
class B
inherit
B
redefine
Default_value
end
feature -- Access
Default_value: STRING = "some B value"
end -- Class
替代一次instance_free
class A
feature -- Access
Default_value: STRING
once
Result := "some A value"
ensure
instance_free: class
end
end -- Class
class B
inherit
B
redefine
Default_value
end
feature -- Access
Default_value: STRING
once
Result := "some B value"
ensure
instance_free: class
end
end -- Class
据我了解,不会使用 B 值创建 once,因为将采用 A class 值
备选属性
class A
feature -- Access
Default_value: STRING
attribute
Result := "some A value"
ensure
instance_free: class
end
end -- Class
class B
inherit
B
redefine
Default_value
end
feature -- Access
Default_value: STRING
attribute
Result := "some B value"
ensure
instance_free: class
end
end -- Class
这样做是唯一的好做法吗?
在提到的 3 种可能性中,只有 instance-free once 函数可以使用,因为
- 常量被冻结,因此无法重新定义;
- 不支持无实例属性。
另一种方法是使用带有 manifest once 字符串的常规函数来保证结果始终相同:
class A feature
default_value: STRING
do
Result := once "some A value" -- Note the modifier "once".
ensure
instance_free: class
constant: Result = default_value -- Ensure the Result is constant.
end
end
但是,与instance-free once函数相比,似乎没有什么特别的好处。 (我仍然会保留后置条件 constant
以避免错误地重新声明该功能。)
编辑。 上面示例的一些细节:
在 运行 时,形式为 "foo"
的常规清单字符串在每次被评估时都会创建一个新的字符串对象。一旦显示 once "foo"
形式的字符串,就只在第一次创建一个新的字符串对象。在随后的评估中,它们生成与之前计算的相同的对象。
查询 f
的后置条件 Result = f
(示例使用 default_value
而不是 f
)确保第二次调用 f
产生与第一次调用相同的对象。实际上,在表达式 Result = f
中, Result
指的是特征计算的对象。调用 f
指的是第二次调用该功能计算的对象。因此,每当我们调用 f
时,它都会产生相同的对象。 (理想情况下,我们会明确要求对该功能的第三次、第四次等调用也产生相同的对象。然而,这超出了语言的表达能力。形式上,f
产生的所有结果相等可以用归纳法证明。)
如
在我的许多情况下,我希望有一个可以重新定义的常量。我认为 避免在每次咨询时创建 没有意义的替代方案是
那不行
class A
feature -- Access
Default_value: STRING = "some A value"
end -- Class
class B
inherit
B
redefine
Default_value
end
feature -- Access
Default_value: STRING = "some B value"
end -- Class
替代一次instance_free
class A
feature -- Access
Default_value: STRING
once
Result := "some A value"
ensure
instance_free: class
end
end -- Class
class B
inherit
B
redefine
Default_value
end
feature -- Access
Default_value: STRING
once
Result := "some B value"
ensure
instance_free: class
end
end -- Class
据我了解,不会使用 B 值创建 once,因为将采用 A class 值
备选属性
class A
feature -- Access
Default_value: STRING
attribute
Result := "some A value"
ensure
instance_free: class
end
end -- Class
class B
inherit
B
redefine
Default_value
end
feature -- Access
Default_value: STRING
attribute
Result := "some B value"
ensure
instance_free: class
end
end -- Class
这样做是唯一的好做法吗?
在提到的 3 种可能性中,只有 instance-free once 函数可以使用,因为
- 常量被冻结,因此无法重新定义;
- 不支持无实例属性。
另一种方法是使用带有 manifest once 字符串的常规函数来保证结果始终相同:
class A feature
default_value: STRING
do
Result := once "some A value" -- Note the modifier "once".
ensure
instance_free: class
constant: Result = default_value -- Ensure the Result is constant.
end
end
但是,与instance-free once函数相比,似乎没有什么特别的好处。 (我仍然会保留后置条件 constant
以避免错误地重新声明该功能。)
编辑。 上面示例的一些细节:
在 运行 时,形式为
"foo"
的常规清单字符串在每次被评估时都会创建一个新的字符串对象。一旦显示once "foo"
形式的字符串,就只在第一次创建一个新的字符串对象。在随后的评估中,它们生成与之前计算的相同的对象。查询
f
的后置条件Result = f
(示例使用default_value
而不是f
)确保第二次调用f
产生与第一次调用相同的对象。实际上,在表达式Result = f
中,Result
指的是特征计算的对象。调用f
指的是第二次调用该功能计算的对象。因此,每当我们调用f
时,它都会产生相同的对象。 (理想情况下,我们会明确要求对该功能的第三次、第四次等调用也产生相同的对象。然而,这超出了语言的表达能力。形式上,f
产生的所有结果相等可以用归纳法证明。)