Smalltalk副本的对象和工作的变量

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)

Lea*_*lia 5

如果我理解正确,您想要的是克隆对象,修改克隆,然后返回修改后的副本.我对吗?如果是这样,请允许我为您提供一些指导:

  1. 您确实可以使用实现克隆机制deepCopy.但请注意,该案例在Smalltalk中很重要,所以请不要发送DeepCopy消息,因为(很可能)它不会存在,请deepCopy改为使用:

    temp := self deepCopy.
    
    Run Code Online (Sandbox Code Playgroud)
  2. 名称对可读性至关重要.因此,避免使用诸如的泛型变量temp.在这种情况下,我建议将临时重命名为clone,这更好地反映了您的意图:

    | clone |
    clone := self deepCopy.
    
    Run Code Online (Sandbox Code Playgroud)

    明白了吗?名称clone左边告诉读者什么,你在做什么.表达式self deepCopy告诉你如何做到这一点.

  3. 在Smalltalk中,您可以通过向对象属性发送消息来访问它.没有点符号>>或任何东西.要发送消息,请在两者之间留一个空格:

    clone arrayName
    
    Run Code Online (Sandbox Code Playgroud)

    正如我的好朋友所说,在Smalltalk中,发送操作符是空白区域.

  4. 尽量不要撰写关键字信息.使用临时代替,并给他们揭示名称:

     value := clone arrayName at: i.
     clone arrayName at i: put: value + 10
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,value我使用的名称不是很好,因为它太通用了.如果您的数组包含您应该使用的价格price.如果您的数组包含点,请使用point等.

  5. 关于上面的第3项,从外部访问对象属性的唯一方法是向对象发送消息.在您的情况下,您想要读取points对象的内容,因此您需要提供一个#points方法来回答对象以某种方式具有的点集合.例如,如果您的类具有points实例变量,则使用该名称定义方法

    points
      ^points
    
    Run Code Online (Sandbox Code Playgroud)

    (在我上面使用的项目中,arrayName因为那是您在问题中最初使用的选择器.)