2013-04-23 70 views
4

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

例如Myobjcet new

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

回答

2

如果我记得,应该避免重新实现类方法newinitialize。相反,您可以创建自己的类方法(除了新的或初始化的),它需要参数,并在创建新实例时使用这些方法。例如在Squeak中查看类别方法with:的类别Collection。它首先创建一个集合实例,然后将作为参数传递的对象添加到实例中。

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

    ^self new 
     add: anObject; 
     yourself 

Pharo也许基于佳乐,所以你应该找到相同的,或在您的图像Collection相似的类方法。

+0

所以这是通过调用类方法来实例化对象的一种很好的方法。我不知道。想知道它是否是一种好的做法。 – j10 2013-04-23 15:57:09

+0

如果您需要在创建对象时初始化新创建的对象,那么是的,创建您自己的类方法是(我相信)很好的做法。这里有更多有经验的Smalltalkers,所以他们最终会在这件事上发表意见。如果他们另有说法,那么我会相信他们对我的看法。 :) – 2013-04-23 15:59:48

+0

感谢您的建议。 – j10 2013-04-23 16:23:21

5

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

为了避免混乱,并有明确的,一致的规则海边团队决定采用以下规则对他们所有代码:

http://code.google.com/p/seaside/wiki/ObjectInitialization

而且海边代码包含您在错误代码评论家规则使用建议的初始化模式。

+0

在阅读完这些之后,我认为这或多或少是我多年来为自己提出的规则,主要是通过反复试验(也就是打我的脚)。我已预订标记以供将来参考。 – 2013-04-23 18:01:48