2017-11-15 12 views
1

こんにちは私はSmalltalkで小さなプログラムを実行する必要がありますが、私は何が間違っているのか分かりません。 私は抽象クラスClass1を持っていますが、Class2のようなサブクラスはほとんどありません。オブジェクトのSmalltalkコピーと変数の作業

私がしたいことは、Class1クラスのメソッドのオブジェクトを自分自身のコピーとして作成し、それに戻ってから作業してください。奇妙に聞こえるかもしれませんが、私は説明が面倒です。

は、私の方法は次のようになります。

|temp| 

temp:= self DeepCopy. 
1 to: temp >> arrayName size do: 
[i: | tenp >> arrayName at i: put (temp >> arrayName at: i) + 10]. 

^temp 

これはSmalltalkの中に私の最初のプログラムであり、もちろん、それは多分あなたは、この言語を知って、あなたは助けることができる、機能していません(値はクラス1から変数です)私は少し。

はあなたに

ありがとう//////////////////////////////////////// ////////////////////////////編集

私の方法

move: vector 

    | temp | 
    temp :=self deepCopy. 

    1 to: temp points size do: 
    [:i | temp points at: i put: (temp points at: i) + vector]. 

    ^temp . 

と利用

geo_1:=(Triangle new) initialize 10. 
geo_2:= geo_1 move: [email protected] 
+0

OK。そして何が効いていないのですか?どのようなエラーが出ますか? –

+0

@Leandro Canigliaは未処理の例外に関するエラーです:メッセージが理解できません:#deepCopy – Eken

+0

'copy'を試してください。それは動作するはずです。 –

答えて

5

私が正しく理解しているのであれば、オブジェクトをクローンし、クローンを修正してから、修正コピー。私は正しい?もしそうなら、私はいくつかのガイダンスを提供してみましょう:

  1. あなたは確かにdeepCopyを使用してクローニングメカニズムを実装することができます。

    temp := self deepCopy. 
    
  2. 名前は読みやすさのために非常に重要である:代わりにdeepCopyを使用し、(ほとんどの場合)が存在しないので、Smalltalkので、その場合の問題はそうDeepCopyメッセージを送信しないでくださいしかし、注意してください。したがって、tempのような汎用変数の使用は避けてください。この場合、私はあなたの意図を反映した、より良い、cloneに一時的な名前を変更することをお勧め:

    | clone | 
    clone := self deepCopy. 
    

    は、私が何を意味するかを参照してください?左のcloneという名前は、読者にあなたに何をしているのかを伝えています。self deepCopyはあなたがそれをやっている方法をに伝えます。

  3. Smalltalkでは、オブジェクトプロパティにメッセージを送信してアクセスします。ドット表記はありません。>>などがあります。メッセージを送信するにはちょうど間にスペースを残す:私の良き友人が言うように、

    clone arrayName 
    

    のSmalltalkでを送信オペレータは空白です。

  4. キーワードメッセージを作成しないようにしてください。代わりに一時を使用し、それらを明らかに名前を付ける:

    value := clone arrayName at: i. 
    clone arrayName at i: put: value + 10 
    

    注一般的すぎるので、私が使用している名前valueが良いものではないこと。配列に価格が含まれている場合は、代わりにpriceを使用してください。配列にポイントが含まれている場合は、pointなどを使用してください。

  5. 上記3については、外部からオブジェクトプロパティにアクセスする唯一の方法は、オブジェクトにメッセージを送信することです。あなたの場合、オブジェクトのpointsを読みたいので、オブジェクトが何らかの形で持っている点の集合に答えて#pointsメソッドを提供する必要があります。たとえば、場合、あなたのクラスはpointsインスタンス変数は

    points 
        ^points 
    

    ように、その名前のメソッドを定義します(それはあなたがあなたの質問に最初に使用セレクタだったので、私上記の項目に代わりarrayNameを使用しました。)している

+0

レオナルドに感謝してくれてありがとう、感謝しています。応答によると、はい、私はコピーを作成し、それを変更し、それを戻したいと思います。私はコードを変更するが、まだ動作していない。私は何をしたいかについて何かもっと言おうとします、おそらく問題は別のところかもしれません。だから私はそれの新しいオブジェクトを作成したい、前のものの修正されたコピーです。最初に、私は次のようなものを作成しています:variable1:=(Class2 new)initialize:10.そして今、私の修正したオブジェクトvariable2を作成します:= variable1 methodName:argumentThatChangeSmg。 (私はその種の名前をデモンストレーションのためだけに使用します) – Eken

+0

@Ekenはあなたのコードの断片を質問に貼り付けるので、私たちはあなたを助けます。 –

+0

投稿を編集しました – Eken

関連する問題