Eke*_*ken 1 smalltalk copy return object
嗨,我需要在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
Run Code Online (Sandbox Code Playgroud)
这是我在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 .
Run Code Online (Sandbox Code Playgroud)
和用法
geo_1:=(Triangle new) initialize 10.
geo_2:= geo_1 move: 2@2
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,您想要的是克隆对象,修改克隆,然后返回修改后的副本.我对吗?如果是这样,请允许我为您提供一些指导:
您确实可以使用实现克隆机制deepCopy.但请注意,该案例在Smalltalk中很重要,所以请不要发送DeepCopy消息,因为(很可能)它不会存在,请deepCopy改为使用:
temp := self deepCopy.
Run Code Online (Sandbox Code Playgroud)名称对可读性至关重要.因此,避免使用诸如的泛型变量temp.在这种情况下,我建议将临时重命名为clone,这更好地反映了您的意图:
| clone |
clone := self deepCopy.
Run Code Online (Sandbox Code Playgroud)
明白了吗?名称clone左边告诉读者什么,你在做什么.表达式self deepCopy告诉你如何做到这一点.
在Smalltalk中,您可以通过向对象属性发送消息来访问它.没有点符号>>或任何东西.要发送消息,请在两者之间留一个空格:
clone arrayName
Run Code Online (Sandbox Code Playgroud)
正如我的好朋友所说,在Smalltalk中,发送操作符是空白区域.
尽量不要撰写关键字信息.使用临时代替,并给他们揭示名称:
value := clone arrayName at: i.
clone arrayName at i: put: value + 10
Run Code Online (Sandbox Code Playgroud)
请注意,value我使用的名称不是很好,因为它太通用了.如果您的数组包含您应该使用的价格price.如果您的数组包含点,请使用point等.
关于上面的第3项,从外部访问对象属性的唯一方法是向对象发送消息.在您的情况下,您想要读取points对象的内容,因此您需要提供一个#points方法来回答对象以某种方式具有的点集合.例如,如果您的类具有points实例变量,则使用该名称定义方法
points
^points
Run Code Online (Sandbox Code Playgroud)
(在我上面使用的项目中,arrayName因为那是您在问题中最初使用的选择器.)
| 归档时间: |
|
| 查看次数: |
311 次 |
| 最近记录: |