修改 Eiffel 中的 class 个属性

Modify class attributes in 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?它似乎没有更新值。 我读到客户端 class 属性是只读的。是真的吗?

问题不在于变量属性,而在于从未执行循环这一事实。只需删除循环,同时保持对过程的调用 increment,您就会看到不同之处。

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

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

  2. 变量i在循环体内没有变化,所有循环迭代的初始值都相同

次要评论:

  • 埃菲尔不需要"getter"方法,比如get_x。可以直接用x

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