在smalltalk中实现new with argument

时间:2015-03-12 04:36:38

标签: smalltalk squeak

我基本上想要实现new,它可以接受参数e.x obj := SomeClass new: 'a'。我试图以这种方式实现

initialize: bdata
    data := bdata

但这不起作用。因为缺乏知识,我似乎在做一些愚蠢的错误。我试着去谷歌,但找不到任何例子。请帮忙。

3 个答案:

答案 0 :(得分:4)

您的代码太短,无法分辨出错误。一般来说,你应该用arg进行初始化,如下所示:

initialize: arg
  self initialize.
  instVar := arg

然后你可以像这样实现new:

new: arg
  ^ self basicNew
     initialize: arg;
     yourself

请注意,new已实施为self basicNew initialize,因此,如果您从自定义初始化方法中调用initialize,则不应在自定义中使用new新的,请改用basicNew

答案 1 :(得分:4)

在Smalltalk中,newnew:不是关键字,而是常规消息。它们只是由对象的类实现。要为对象的类(而不是实例)编写方法,请单击"类"系统浏览器中的按钮。在那里,您可以实施new:方法。

但请注意,命名您自己的实例创建方法new:通常不是一个好主意。由于这是一种常规方法,因此您可以将其命名为任何名称。例如,MyClass withBData: foo。使它成为一个很好的描述性名称。它可能看起来像

withBData: bdata
    | inst |
    inst := self new.
    inst bdata: bdata.
    ^inst

答案 2 :(得分:0)

如果需要在initialize方法中使用参数,则可以使用basicNew方法(如Uko在上面的回答中所述)。

withBData: bdata
    ^ (self basicNew bdata: bdata) initialize