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

时间:2017-11-15 22:43:07

标签: object copy return smalltalk

嗨我需要在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

1 个答案:

答案 0 :(得分:5)

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

  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,因为那是您最初在问题中使用的选择器。)