我正在尝试做一个不可变的POINT
在埃菲尔铁塔上课。下面的代码定义了一个吗?这{NONE}
的可访问性x
and y
田地就够了吗?我可以给类不变量写一些东西吗x = x'
,或者我还能如何实现不变性?
class POINT
create
make
feature {NONE}
x: DOUBLE
y: DOUBLE
feature
make (x_: DOUBLE; y_: DOUBLE)
do
x := x_
y := y_
ensure
set: x = x_ and y = y_
end
feature --accessors
get_x: DOUBLE
do
Result := x
ensure
Result = x
end
end
Eiffel 不允许其客户端更改类的属性。例如,以下代码被拒绝:
p: POINT
...
p.x := 5.0
因此,不需要提供 getter(就像在其他一些语言中一样)。你可以只使用p.x
前提是x
已充分导出到客户端类。因此,您的示例的代码可以简化为
class POINT
create
make
feature -- Access
x: DOUBLE
y: DOUBLE
feature {NONE} -- Creation
make (x0: DOUBLE; y0: DOUBLE)
-- Initialize object with `x0' and `y0'.
do
x := x0
y := y0
ensure
set: x = x0 and y = y0
end
end
注意创建过程是not不再导出,否则可以将其用作正常(即非创建)例程并更改属性,也就是说,我们可以执行以下操作
create p.make (1, 1)
p.make (2, 3)
print (p)
这会打印(2, 3)
,即您将能够更改原始对象的值p
,使其可变。
虽然现在不能直接更改属性,但仍然可以调用功能copy
在类型的对象上POINT
并改变整个对象。如果你也想避免这种情况,可以在类中重新定义该功能POINT
引发异常,甚至有后置条件False
导致运行时为您引发异常:
copy (other: like Current)
-- <Precursor>
do
(create {EXCEPTIONS}).raise ("Attempt to change an immutable object.")
ensure then
is_allowed: False
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)