在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/

    10-13 09:30