java - 对象递归调用彼此方法的示例

标签 java c# oop smalltalk pharo

我正在做博士研究,在一次讨论中我提到在 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/

相关文章:

php - 在 PHP 中扩展 DateTime 和 DateTimeImmutable

c# - 在此示例中如何避免破坏 LSP? C#

python - python 2.7 中的继承

java - android中的内部广播

java - JPA - 为什么使用@JoinColumn?

java - 如何配置 tomcat 以便我可以在本地主机上运行我的(java)网络应用程序

java - 使用内容值的更新方法

c# - 作为约束 Delaunay 三角剖分的结果识别出多边形三角剖分

c# - ASP.NET Core OpenIdConnect 服务器数据保护 key 位置

c# - 使用 Entity Framework Core 在运行时迁移