如this question所述,无法定义我可以重新定义为后代的常量。
在我的许多情况下,我都希望有一个可以重新定义的常数。我看到的避免在每次咨询中创建广告的其他选择都是
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
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值创建,因为会采用A类值
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
这样做是唯一且好的做法吗?
答案 0 :(得分:2)
在提到的3种可能性中,只能使用一次无实例的函数,因为
另一种方法是使用带有清单一次字符串的常规函数以确保结果始终相同:
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
但是,与无实例一次功能相比,似乎没有什么特别的好处。 (我仍然保留后置条件constant
,以避免错误地重新声明该功能。)
编辑。上面示例的一些详细信息:
在运行时,格式"foo"
的常规清单字符串每次被评估时都会创建一个新的字符串对象。一旦清单形式once "foo"
的清单字符串第一次创建,就创建一个新的字符串对象。在随后的评估中,它们会产生与先前计算出的对象相同的对象。
Result = f
的后置条件f
(示例使用default_value
代替f
)确保对f
的第二次调用产生了与第一个通话相同的对象。实际上,在表达式Result = f
中,Result
指的是特征计算出的对象。调用f
指的是对特征的第二次调用所计算的对象。因此,每当我们调用f
时,它都会产生相同的对象。 (理想情况下,我们明确要求该功能的第三,第四等调用也产生相同的对象。但是,这超出了语言的表达能力。形式上,f
产生的所有结果均相等可以通过归纳证明。)