在 Java 和 C++ 等语言中,我们为构造函数提供参数。
你如何在 Pharo Smalltalk 中做到这一点?
我想要类似的东西
|aColor|
aColor = Color new 'red'.
或者这是不好的做法,我应该总是这样做
|aColor|
aColor = Color new.
aColor name:= red.d
最佳答案
简短的回答是,您可以在 Smalltalk 中做几乎相同的事情。从调用代码来看,它看起来像:
aColor := Color named: 'Red'.
长的答案是在 Smalltalk 中你没有构造函数,至少在你有一个以类命名的特殊消息的意义上没有。您在 Smalltalk 中所做的是定义类端消息(即类理解的消息,而不是实例 [*]),您可以在其中实例化和配置实例。假设您的
Color
类(class)有 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
关于Smalltalk 初始化变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14224625/