[英]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
如果我對您的理解正確,那么您想要的是克隆對象,修改克隆,然后返回修改后的副本。 我對嗎? 如果是這樣,讓我為您提供一些指導:
您確實可以使用deepCopy
實現克隆機制。 但是請注意,在Smalltalk中,大小寫很重要,因此請不要發送DeepCopy
消息,因為(很可能)該消息將不存在,而應使用deepCopy
:
temp := self deepCopy.
名稱對於可讀性至關重要。 因此,請避免使用諸如temp
之類的通用變量。 在這種情況下,我建議將臨時名稱重命名為clone
,這更好地反映了您的意圖:
| clone | clone := self deepCopy.
明白了嗎? 名稱clone
左邊會告訴你正在做什么的讀者。 表達self deepCopy
告訴你是如何做的。
在Smalltalk中,您可以通過發送消息來訪問對象屬性。 沒有點符號或>>
或與此有關的任何內容。 要發送消息,只需在兩者之間留一個空格:
clone arrayName
正如我的一個好朋友所說的, 在Smalltalk中,發送方是空白 。
盡量不要撰寫關鍵字消息。 改用臨時工,並給他們顯示名稱:
value := clone arrayName at: i. clone arrayName at i: put: value + 10
請注意,我使用的名稱value
不是很好,因為它太通用了。 如果數組包含價格,則應改用price
。 如果您的數組包含點,請使用point
等。
關於上面的第3項,從外部訪問對象屬性的唯一方法是向對象發送消息。 對於您的情況,您想讀取對象的points
,因此您需要提供一個#points
方法,以某種方式回答對象所具有的點的集合。 例如,如果您的類有一個points
實例變量,請定義一個名稱為
points ^points
(在上面的項目中,我改用了arrayName
因為那是您最初在問題中使用的選擇器。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.