我正在做博士研究,在一次讨论中我提到在 OOP 中,两个对象可能会递归地互相调用。然后我的 friend 问我是否有一个例子,这种情况发生在更真实的例子(而不是人为的例子)中。
我想不出一个。
不显示构造函数的人工示例的伪代码:
class A
private B b;
void a1() { b.b1(); }
void a2() { print “finished”; }
class B
private A a;
void b1() { a.a2(); }
方法线性化是:
A.a1() ----> B.b1() ----> A.a2()
是否有更真实的示例,其中可能会发生调用两个不同对象的方法?
最佳答案
看看 Smalltalk 如何通过双重调度处理强制。
在吱吱声图像中:
Float>>+ aNumber
"Primitive. Answer the sum of the receiver and aNumber. Essential.
Fail if the argument is not a Float. See Object documentation
whatIsAPrimitive."
<primitive: 41>
^ aNumber adaptToFloat: self andSend: #+
Integer>>adaptToFloat: rcvr andSend: selector
"If I am involved in arithmetic with a Float, convert me to a Float."
^ rcvr perform: selector with: self asFloat
因此,如果您执行 1.5 + 3
,则将 +
发送到 1.5(Float),1.5 将 adaptToFloat:andSend:
发送到 3 (一个整数),3 再次将 +
发送到 1.5(第二次使用 3 asFloat
而不是 3
)。
不会将其称为仅两步的递归,但它很接近您的示例。
注意:Float>>+
中的原语失败,并且执行后的 Smalltalk 代码。
关于java - 对象递归调用彼此方法的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36811921/