在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
类具有一个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中类和元类的引用。
高温超导
关于Smalltalk初始化变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14224625/