Object Smalltalk复制对象并处理变量

Object Smalltalk复制对象并处理变量,object,copy,return,smalltalk,Object,Copy,Return,Smalltalk,嗨,我需要在Smalltalk中做一个小程序,但我不确定我做错了什么。 因此,我有一个抽象类Class1,它有几个子类,例如Class2 我想做的是在方法Class1类中创建一个对象作为它们自身的副本,处理它,然后返回。我知道这听起来很奇怪,但我的解释很糟糕 我的方法如下所示: (值是来自Class1的变量) 这是我在Smalltalk中的第一个程序,当然它不起作用了,也许你知道这门语言,你可以帮我一点忙 多谢各位 ////////////////////////////////////////

嗨,我需要在Smalltalk中做一个小程序,但我不确定我做错了什么。 因此,我有一个抽象类Class1,它有几个子类,例如Class2

我想做的是在方法Class1类中创建一个对象作为它们自身的副本,处理它,然后返回。我知道这听起来很奇怪,但我的解释很糟糕

我的方法如下所示: (值是来自Class1的变量)

这是我在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

如果我理解正确,您需要的是克隆一个对象,修改克隆,然后返回修改后的副本。我说得对吗?如果是这样,让我给你一些指导:

  • 您确实可以使用
    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
    。如果阵列包含点,请使用

  • 关于上面的第3项,从外部访问对象属性的唯一方法是向对象发送消息。在本例中,您希望读取对象的
    ,因此需要提供一个
    #点
    方法,该方法以某种方式与对象的点集合相匹配。例如,如果您的类有一个
    实例变量,请将该名称的方法定义为

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


  • 如果我理解正确,您需要的是克隆一个对象,修改克隆,然后返回修改后的副本。我说得对吗?如果是这样,让我给你一些指导:

  • 您确实可以使用
    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
    。如果阵列包含点,请使用

  • 关于上面的第3项,从外部访问对象属性的唯一方法是向对象发送消息。在本例中,您希望读取对象的
    ,因此需要提供一个
    #点
    方法,该方法以某种方式与对象的点集合相匹配。例如,如果您的类有一个
    实例变量,请将该名称的方法定义为

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


  • 谢谢莱昂纳多的回复,我很感激。根据回复,是的,你有权利,我想复制并修改它,然后退回。我更改了代码,但仍然不起作用。我会尽量多说一些我想做的事情,也许问题出在别的地方。所以我想创建一个新的对象,它是前一个对象的修改副本。首先,我创建如下内容:variable1:=(Class2 new)initialize:10。现在我想创建修改过的对象variable2:=variable1方法名:argumentThatChangeSmg。(我使用这种名称只是为了演示)@Eken将您的代码片段粘贴到问题中,这样我们就可以帮助您了。@Leonardo Cainglia谢谢您的编辑,我不知道为什么,但它仍然不起作用。没有错误,简单地说,新对象被修改了,并且原始对象也发生了变化,这是因为
    拷贝
    。我建议就此提出一个新问题,因为
    copy
    需要更多的考虑。@Leonardo Cainglia是的,你是对的。我解决了这个问题,而不是复制我只使用了一个新的对象和能力后,acc