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



我正在做博士研究,在一次讨论中,我提到在OOP中,两个对象可能会递归地相互调用。然后我的朋友问我是否有一个例子,这发生在更真实世界的例子中(不是人为的例子)。

我想不出一个。

不显示构造函数的人工示例的伪代码:

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(浮点数),1.5 将adaptToFloat:andSend:发送到 3(整数),3 再次将+发送到 1.5(第二次使用 3 asFloat 而不是 3)。

不会只用两个步骤称之为递归,但它接近你的例子。

注意:Float>>+ 中的原语失败,执行后的 Smalltalk 代码失败。

你同意@Sanjeev的观点,即在真实的例子中根本不应该发生这种情况,因为它在很多层面上都是错误的,但让我们假设一个糟糕的设计师犯了这个错误; 在很多情况下都可以这样做。 例如:在账户对象中完成余额计算功能的银行系统, 但因为客户可能拥有多个帐户(并且该帐户可以由许多客户拥有)。设计人员认为,能够从任何帐户对象计算所有帐户的客户余额是一个好主意,并且应该通过与托管人的关系来完成。使用代码示例:

class BankAccount
  private Customer cust;
  void TotalBalance() {  cust.Balance(); }
  void OwnersBalance() { print “finished”; }
class Customer
  private Account acc;
  void Balance() { acc.OwnersBalance(); }

希望我正确理解您的需求,这是一个可能的真实示例。

想象一下经理收到一个需要交付的项目的情况。经理将项目交给员工,员工完成交付给客户的项目。

public class StackOverFlow {
    public static void main(String[] args) {
        Employee emploeyee = new Employee();
        ProjectManager projectManager = new ProjectManager(emploeyee);
        projectManager.initiateProject();
    }
    public static class ProjectManager {
        Employee emploeyee;
        public ProjectManager(Employee emploeyee) {
            this.emploeyee = emploeyee;
        }
        public void initiateProject() {
            System.out.println("Manager Starts project...");
            this.emploeyee.finishProject(this);
        }
        public void deliverProjectToClient() {
            System.out.println("Manager delivers finished project to client");
        }
    }
    public static class Employee {
        public Employee() {
        }
        public void finishProject(ProjectManager projectManager) {
            System.out.println("Employee delivers finished project to manager");
            projectManager.deliverProjectToClient();
        }
    }
}

输出:

Manager Starts project... 
Employee delivers finished project to manager
Manager delivers finished project to client

希望这有帮助

相关内容

  • 没有找到相关文章

最新更新