我正在做博士研究,在一次讨论中,我提到在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
希望这有帮助