在smalltalk中实现新的带参数

在smalltalk中实现新的带参数,smalltalk,squeak,Smalltalk,Squeak,我基本上想要实现new,它可以接受参数e.xobj:=SomeClass new:'a'。我试图以这种方式实现 initialize: bdata data := bdata 但这不起作用。因为缺乏知识,我似乎犯了一些愚蠢的错误。我试着用谷歌搜索,但找不到任何例子。请帮助。您的代码太短,无法判断出错误。通常,您应该使用arg进行初始化,如下所示: initialize: arg self initialize. instVar := arg new: arg ^ self

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

initialize: bdata
    data := bdata

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

您的代码太短,无法判断出错误。通常,您应该使用arg进行初始化,如下所示:

initialize: arg
  self initialize.
  instVar := arg
new: arg
  ^ self basicNew
     initialize: arg;
     yourself
然后您可以像这样实现
new:

initialize: arg
  self initialize.
  instVar := arg
new: arg
  ^ self basicNew
     initialize: arg;
     yourself

请注意,
new
实现为
self-basicNew-initialize
,因此如果您从自定义初始化方法调用
initialize
,则不应在自定义新建中使用
new
,而应在Smalltalk中使用
basicNew

new
new:
不是关键字,但是定期的信息。它们只是由对象的类实现的。要为对象的类(而不是实例)编写方法,请单击系统浏览器中的“类”按钮。在那里,您可以实现
新:
方法

但是,请注意,将自己的实例创建方法命名为
new:
通常不是一个好主意。因为这是一个常规方法,所以您可以随意命名它。例如,
MyClass with-bdata:foo
。让它成为一个很好的描述性名称。可能看起来像

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

如果需要在initialize方法中使用参数,可以使用basicNew方法(正如Uko在上面的回答中提到的)


初学者常常忽略了
new:
是类方法,而
initialize:
是实例方法。