Smalltalk初始化变量

时间:2013-01-08 21:49:17

标签: smalltalk pharo

在Java和C ++等语言中,我们为构造函数提供参数。

你如何在Pharo Smalltalk中做到这一点?

我想要像

这样的东西
|aColor|
aColor = Color new 'red'.

或者这是不好的做法,我应该一直这样做

|aColor|
aColor = Color new.
aColor name:= red.d

2 个答案:

答案 0 :(得分:12)

简短的回答是你可以在Smalltalk中做同样的事情。从调用代码看起来像:

aColor := Color named: 'Red'.

很长的答案是,在Smalltalk中你没有构造函数,至少在你有一个以类命名的特殊消息的意义上。你在Smalltalk中所做的是定义类端消息(即类所理解的消息,而不是实例[*]),您可以在其中实例化和配置实例。假设您的Color类具有name实例变量并为其设置了setter,#named:方法将实现如下:

(class) Color>>named: aName
| color |
color := self new.
color name: aName.
^color.

有些注意事项:

  • 我们正在使用发送给该类的#new消息来创建新实例。您可以将#new消息视为创建对象的基本方式(提示:您可以浏览#new消息的实现者以了解它是如何实现的。)
  • 我们可以定义尽可能多的类方法,以便创建新的“已配置”实例(例如Color fromHexa:)或返回预先创建的实例(例如Color blue)。
  • 您仍然可以通过Color new创建未初始化的实例。如果您想禁止该行为,则必须覆盖#new类消息。

Stef's Free Online Smalltalk Books

,您可以阅读许多关于Smalltalk基础知识的好书

[*]由于Smalltalk的正交性,这是很自然的,因为所有(包括类)都是一个对象。如果您有兴趣,请查看Pharo by Example的第13章或Smalltalk中对类和元类的任何其他引用。

HTH

答案 1 :(得分:3)

在Smalltalk中,所有成员字段都是严格私有的,要分配给它们,您必须定义分配方法。

Color >> name: aString
  name := aString

然后你可以像这样创建你的对象:

|aColor|
aColor := (Color new)
  name: 'red';
  yourself.

通常使用降低冗长的工厂方法:

Color class >> withName: aName
  ^ (self new)
    name: aName;
    yourself.

有了这个,您可以创建这样的新对象:

|aColor|
aColor := Color withName: 'red'.