在smalltalk中,当我们通过调用new创建一个调用initialize的对象时。我想初始化,但用我自己的参数(在运行时传递)。我怎样才能做到这一点。在smalltalk中新建并初始化 - 如何传递参数来初始化
例如Myobjcet new
但我如何将参数传递给它,以便它们传递给初始化。 我正在使用Pharo。
在smalltalk中,当我们通过调用new创建一个调用initialize的对象时。我想初始化,但用我自己的参数(在运行时传递)。我怎样才能做到这一点。在smalltalk中新建并初始化 - 如何传递参数来初始化
例如Myobjcet new
但我如何将参数传递给它,以便它们传递给初始化。 我正在使用Pharo。
如果我记得,应该避免重新实现类方法new
和initialize
。相反,您可以创建自己的类方法(除了新的或初始化的),它需要参数,并在创建新实例时使用这些方法。例如在Squeak
中查看类别方法with:
的类别Collection
。它首先创建一个集合实例,然后将作为参数传递的对象添加到实例中。
with: anObject
"Answer an instance of me containing anObject."
^self new
add: anObject;
yourself
你Pharo
也许基于佳乐,所以你应该找到相同的,或在您的图像Collection
相似的类方法。
正确编写复杂对象层次结构的实例化和初始化代码在Smalltalk中很棘手。更重要的是,Object
中实现的默认初始化逻辑在不同的Smalltalk方言中是不同的(即Pharo决定引入默认初始化器,使事情变得更糟)。
为了避免混乱,并有明确的,一致的规则海边团队决定采用以下规则对他们所有代码:
http://code.google.com/p/seaside/wiki/ObjectInitialization
而且海边代码包含您在错误代码评论家规则使用建议的初始化模式。
在阅读完这些之后,我认为这或多或少是我多年来为自己提出的规则,主要是通过反复试验(也就是打我的脚)。我已预订标记以供将来参考。 – 2013-04-23 18:01:48
所以这是通过调用类方法来实例化对象的一种很好的方法。我不知道。想知道它是否是一种好的做法。 – j10 2013-04-23 15:57:09
如果您需要在创建对象时初始化新创建的对象,那么是的,创建您自己的类方法是(我相信)很好的做法。这里有更多有经验的Smalltalkers,所以他们最终会在这件事上发表意见。如果他们另有说法,那么我会相信他们对我的看法。 :) – 2013-04-23 15:59:48
感谢您的建议。 – j10 2013-04-23 16:23:21