对象的 Smalltalk 副本并处理变量

Smalltalk copy of object and work on a variables

你好,我需要用 Smalltalk 做一个小程序,但我不确定我做错了什么。 所以,我有一个抽象的 class Class1,它有几个子 class 例如 Class2.

我想做的是在方法 Class1 class 中创建对象作为它们自身的副本,对其进行处理并在 return 之后进行。我知道这听起来可能很奇怪但是我解释的很烂

我的方法是这样的: (值是来自 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

如果我没理解错的话,你想要的是克隆一个对象,修改克隆,然后 return 修改后的副本。我对吗?如果是这样,让我为您提供一些指导:

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

    temp := self deepCopy.
    
  2. 名称对于可读性至关重要。因此,避免使用 temp 等泛型变量。在这种情况下,我建议将临时文件重命名为 clone,这样可以更好地反映您的意图:

    | clone |
    clone := self deepCopy.
    

    明白我的意思了吗?左边的名字clone告诉reader你在做什么。表达式 self deepCopy 告诉 你是怎么做的

  3. 在 Smalltalk 中,您可以通过向对象发送消息来访问对象 属性。没有点符号或 >> 或任何东西。要发送消息,只需在中间留下 space:

    clone arrayName
    

    正如我的一个好朋友所说,在 Smalltalk 中,发送运算符是白色的 space.

  4. 尽量不要写关键字邮件。改用临时对象并给它们起显眼的名字:

     value := clone arrayName at: i.
     clone arrayName at i: put: value + 10
    

    请注意,我使用的名称 value 不是一个好名称,因为它太笼统了。如果您的数组包含价格,您应该改用 price。如果你的数组包含点,使用point,等等

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

    的方法
    points
      ^points
    

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