如何为实例创建方法编写doubledispatch?

mar*_*ver 2 smalltalk squeak pharo

实例创建方法,如

ClassName new
Run Code Online (Sandbox Code Playgroud)

为了帮助一些细节,

我们可以在抽象类中编写一个算术方法,

然后在子类中双重发送它们.

我们可以在实例创建中使用它吗?

我尝试了新的但它失败了.导致一些预定义的基本新方法.

Tra*_*ggs 6

Double Dispatch在这种new情况下真的没有意义.双重调度背后的想法是,您无法通过仅调度接收器来确定正确的行为.(单个)参数的类型对选择(调度)的行为具有相同的效果.换句话说,双重调度只有在你的方法有参数的情况下才有意义,new而不是.

也就是说,您当然可以实现自己的new方法来覆盖库存默认继承的方法.你可以让它做各种有趣的事情.进行某种环境检查以确定适合的子类是很常见的.

AbstractClass>>>new
    ^self platform = #unix
        ifTrue: [SubclassThatLeveragesUnix basicNew]
        ifFalse: [CrappyPCSubclass basicNew]
Run Code Online (Sandbox Code Playgroud)

请注意,我们basicNew在这里使用,而不是new.如果您使用过new,则需要在这些子类中实现不同的覆盖,否则它将AbstractClass>>>new再次继承并重新发送消息.