簡體   English   中英

Smalltalk對象的副本並在變量上工作

[英]Smalltalk copy of object and work on a variables

嗨,我需要在Smalltalk中做一個小程序,但是我不確定自己做錯了什么。 因此,我有一個抽象類Class1,該類沒有幾個子類,例如Class2。

我想做的是在Class1類方法中創建一個對象,作為它們自身的副本,對其進行處理,然后返回。我知道聽起來可能很奇怪,但我很難解釋。

我的方法如下所示:(值是Class1中的變量)

|temp|

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

^temp

這是我在Smalltalk中的第一個程序,它當然不起作用,也許您知道這種語言,並且可以對我有所幫助。

謝謝

///////////////////////////////////////////////////// /////////////////編輯

我的方法

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: 2@2

如果我對您的理解正確,那么您想要的是克隆對象,修改克隆,然后返回修改后的副本。 我對嗎? 如果是這樣,讓我為您提供一些指導:

  1. 您確實可以使用deepCopy實現克隆機制。 但是請注意,在Smalltalk中,大小寫很重要,因此請不要發送DeepCopy消息,因為(很可能)該消息將不存在,而應使用deepCopy

     temp := self deepCopy. 
  2. 名稱對於可讀性至關重要。 因此,請避免使用諸如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因為那是您最初在問題中使用的選擇器。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM