gpt4 book ai didi

oop - 在 Smalltalk 中,当发送者和参数是不同类型时,定义可交换二进制方法的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-03 15:47:49 25 4
gpt4 key购买 nike

假设您有一个 Foo 类,并且您希望能够将一个 Foo 乘以一个 Number 以获得另一个 Foo,使用“@@”作为乘号。
由于乘法是可交换的,所以能够写出很好:

| f a b |
f := Foo new.
a := 3 @@ f.
b := f @@ 3.
self assert: a = b
这不仅需要将二进制方法“@@”添加到 Foo 中,还需要添加到 Number 类中。所以你最终在两个不同的地方使用了本质上相同的方法(以及循环依赖),这看起来很不雅观。
所以我想知道,在 Smalltalk 中,有没有其他方法可以创建可交换的二进制方法,其中发送者和参数是不同的类型——一种不需要你在两个不同的类中定义相同消息的方法?
如果没有,是否可以使用 Smalltalk 本身来创建这种能力(即添加自动管理可交换二进制方法的类/方法,而无需更改实际的 Smalltalk 语言或 VM)?

最佳答案

在您的情况下,如果您不发送 @@ 的参数,会发生什么情况也值得质疑。消息到 Foo 的实例.
例如:

f @@ 'hello'
要省略这一点,您可以使用双重调度。所以你定义了一个乘以一个数字的方法:
Foo>>#multiplyWithANumber: aNumber
"do multiplication with a number"
然后在对象层次结构中,定义 @@ 的入口点。
Object>>#@@ aFoo
"signal some error saying that this operation is not supported"
self shouldNotImplement

Number>>#@@ aFoo
^ aFoo multiplyWithANumber: self

Foo>>#@@ anObject
"pass decision to the parameter"
"also, what should happen if anObject is a Foo"
^ anObject @@ self

这可能过于复杂,在一个简单的情况下,如果您不太关心类型,并且想要避免重复,您可以:
Foo>>#multiplyWithANumber: aNumber
"do multiplication with a number"

Foo>>#@@ aNumber
^ self multiplyWithANumber: aNumber

Number>>#@@ aFoo
^ aFoo multiplyWithANumber: self
当然可以跳过 multiplyWithANumber:在一起,只有一个 @@与实现(可能在 Foo 方面,因为它是此实现的主要原因),以及另一个 @@这只是调用 @@与实现。我喜欢有一个详细的方法,所以很清楚发生了什么,你不必写额外的评论。

关于oop - 在 Smalltalk 中,当发送者和参数是不同类型时,定义可交换二进制方法的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67343767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com