7

在 smalltalk 中,当我们通过调用 new 创建对象时,调用 initialize 。我想初始化但使用我自己的参数(在运行时传递)。我怎样才能做到这一点。

例如Myobjcet new

但是我如何将参数传递给它,以便它们被传递给初始化。我正在使用Pharo。

4

2 回答 2

5

如果我记得,应该避免重新实现类new方法initialize

相反,您可以创建自己的带参数的类方法(除了 new 或 initialize),并在创建新实例时使用这些方法。例如,Squeak查看 class 的类with:方法Collection。它首先创建一个集合实例,然后将作为参数传递的对象添加到该实例中。

with: anObject 
    "Answer an instance of me containing anObject."

    ^ self new
        add: anObject;
        yourself

Pharo可能基于 Squeak,因此您应该Collection在图像中找到相同或类似的类方法。

于 2013-04-23T15:52:06.680 回答
5

在 Smalltalk 中正确编写复杂对象层次结构的实例化和初始化代码是很棘手的。Object更重要的是,在不同的 Smalltalk 方言中实现的默认初始化逻辑是不同的(即 Pharo 决定引入默认初始化器,这让事情变得更糟)。

为了避免混淆并制定清晰一致的规则,Seaside 团队决定对其所有代码应用以下规则:

Seaside 的对象初始化

此外,Seaside 代码还包括 Code Critic 规则,用于检查建议的初始化模式使用中的错误。

于 2013-04-23T16:57:17.620 回答