2017-12-20 16 views
0

Goodmorning。 私は大学でエッフェル塔を使い始めました。エッフェル塔のクラス属性を変更します

私はこの例を持っている:

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であるのはなぜ?それは値を更新しないようです。 クライアントクラスの属性が読み取り専用であることを読んだことがあります。本当ですか?

答えて

0

問題は可変属性ではなく、ループが実行されないという事実を伴います。プロシージャincrementへの呼び出しを保ったままループを削除すると、その違いがわかります。

がループについて言えば、コードが2つの問題があります。他の言語のwhileループ異なり

  1. を、until部分での発現は、終了条件です。この状態がtrueになると、ループが終了します。このコードでは、これは最初の繰り返し(i = 00 < 20)で、つまりループ本体に触れることなく行われます。

  2. 変数iはループ本体で変更されず、すべてのループ反復で同じ初期値を持ちます。

マイナーコメント:

  • などget_xなどエッフェルの "ゲッター" メソッドは必要ありません。 xを直接使用することができます。

  • 自己初期化変数属性は、オブジェクト作成時にデフォルト値に設定されます。特にxは、タイプCLASS_1のオブジェクトが作成されたとき0に設定されます。 x := 0を作成プロシージャに含めることは無害ですが、このプロシージャを通常のプロシージャとしても使用しない限り無意味です。

関連する問題