Smalltalk 初始化变量

标签 smalltalk pharo

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

    相关文章:

    smalltalk - 使用 SLL 文件类型的经验,可能是 Serena 或 Synergex PVCS 文件?

    smalltalk - Pharo是否提供尾叫优化?

    smalltalk - 在 Smalltalk 中构建解释器

    smalltalk - 如何在 Squeak FFI 中同时支持 32 位和 64 位目标

    reflection - 是否可以在 Smalltalk 中扩展单个对象

    observer-pattern - 公告与经典 Smalltalk-80 依赖/更改/更新机制有何关系?

    repository - Pharo 工作流 : file out, 切片并保存到存储库

    deployment - 正确删除Seaside中的开发工具栏

    text - 如何在 Pharo 1.4 中正确解码来自 FileSystemReadStream 的文本文件

    smalltalk - 在 Pharo Smalltalk 中发送 Zodiac 邮件