8

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

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

我想要类似的东西

|aColor|
aColor = Color new 'red'.

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

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

2 回答 2

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 的免费在线 Smalltalk 书籍中,您可以阅读许多关于 Smalltalk 基础知识的好书

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

高温高压

于 2013-01-08T22:14:00.377 回答
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'.
于 2013-01-08T22:03:30.680 回答