修改Eiffel中的类属性

时间:2017-12-20 12:03:38

标签: eiffel

早安。 我在大学开始使用Eiffel。

我有这个例子:

    class
      CLASS_1

    create make

    feature
      x: INTEGER

      make
        do
         x:=0
        end

      increment(inc: INTEGER)
        do
          x:=x+inc
        end

      get_x: INTEGER
        do
          Result:=x
        end
    end

----------------
class
   CLASS_2

create make_2

feature
    make_2
        do
            print("EXAMPLE")
            meth_1
        end
    meth_1
    local
        instance: CLASS_1
        i: INTEGER
    do
        create instance.make
        from
            i:=0
        until
            i<20
        loop
            instance.increment(5)
        end
        io.put_string ("The result is: ")
        io.put_integer (instance.get_x)
    end
end

为什么结果始终为0?似乎它没有更新价值。 我读过客户端类属性是只读的。这是真的吗?

1 个答案:

答案 0 :(得分:1)

问题不在于变量属性,而在于循环永远不会被执行。只需删除循环,同时保持对过程increment的调用,您就会看到差异。

谈到循环,代码有两个问题:

  1. 与其他语言中的while循环不同,until部分中的表达式是退出条件。只要此条件为true,循环就会退出。在此代码中,这发生在第一次迭代(因为i = 00 < 20),即没有触及循环体。

  2. 变量i在循环体中没有改变,并且对于所有循环迭代具有相同的初始值。

  3. 次要评论:

    • 不需要&#34; getter&#34; Eiffel中的方法,例如get_x。您可以直接使用x

    • 自我初始化变量属性设置为对象创建时的默认值。特别是,当创建类型为x的对象时,0设置为CLASS_1。在创建过程中使用x := 0是无害的,但除非您想将此过程用作常规过程,否则也无用。