我正在进行博士研究,在讨论中我提到过,在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()
是否有一个更真实的例子,可能会调用两个不同对象的方法?
答案 0 :(得分:3)
看看Smalltalk如何通过双重调度处理胁迫。
在Squeak图片中:
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发送+
到3 asFloat
再次使用1.5(第二次使用3
代替Float>>+
)。
只用两步就不会称之为递归,但它接近你的例子。
注意:return things.Select(_ => new Thing
{
Name = _.Split(';')[0],
Id = Convert.ToInt32(_.Split(';')[0])
}).ToArray();
中的原语失败,并且执行后的Smalltalk代码。
答案 1 :(得分:0)
你同意@Sanjeev在实例中根本不应该发生这种情况,因为它在很多层面都是错误的,但让我们假设一个糟糕的设计师犯了这个错误;它可以在很多情况下完成。例如:银行系统,其中余额计算功能在帐户对象中完成,但因为客户可能拥有更多的帐户(并且该帐户可以由许多客户拥有)。设计师认为能够从任何帐户对象计算所有帐户中的客户余额是一个好主意,并且应该通过与cutomer的关系来完成。使用您的代码示例:
ggplot(agg.table.year,aes(x=YR,y=prc)) +
scale_y_continuous(limits=c(0,100),expand=c(0,0)) +
geom_bar(stat='identity',width=0.7) +
theme_bw(base_size = 12) + xlab('') + ylab('Percent') +
theme(axis.text.x=element_text(angle=45,hjust=1,size=13)) +
theme(axis.text.y=element_text(size=13)) +
ggtitle("Fraction of government-funded studies
答案 2 :(得分:0)
希望我能正确理解你的需要,这是一个可能的现实生活的例子。
想象一下,经理收到一个需要交付的项目。 经理将项目交给员工,员工完成交付给客户的项目。
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
希望这有帮助