繁体   English   中英

埃菲尔铁塔:创建可重新定义的“常数”的最佳方法

[英]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值创建,因为会采用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

这样做是唯一且好的做法吗?

在上述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以避免错误地重新声明该功能。)

编辑。 以上示例的一些细节:

  1. 在运行时,形式为"foo"常规清单字符串每次被评估时都会创建一个新的字符串对象。 一旦清单形式的字符串一次出现,则once "foo"只会第一次创建一个新的字符串对象。 在随后的评估中,它们会产生与先前计算出的对象相同的对象。

  2. 后置条件Result = f查询f (示例使用default_value代替f )确保对第二呼叫f产生相同的对象作为第一呼叫。 实际上,在表达式Result = fResult由特征计算的对象。 调用f指的是对特征的第二次调用所计算的对象。 因此,无论何时调用f ,它都会产生相同的对象。 (理想情况下,我们明确要求该功能的第三,第四等调用也产生相同的对象。但是,这超出了语言的表达能力。形式上,由f产生的所有结果的相等性可以通过证明感应。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM