嗨我需要在Smalltalk中做一个小程序,但我不确定我做错了什么。 所以,我有一个抽象类Class1,它有几个子类,例如Class2。
我想要做的是在方法Class1类中创建对象作为self的副本,在它上面工作并在返回之后。我知道这可能听起来很奇怪,但我的解释很糟糕。
我的方法如下: (value是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
答案 0 :(得分:5)
如果我理解正确,你想要的是克隆一个对象,修改克隆,然后返回修改后的副本。我对吗?如果是这样,请允许我为您提供一些指导:
您确实可以使用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
,因为那是您最初在问题中使用的选择器。)