我在这里面临的困境是什么是什么,什么不是循环参考......以及如何在肯定的情况下摆脱它.
假设我有一个Main实例化两个不同类的类,其中每个类都需要在另一个类中执行一个方法:
MyMain {
AlarmManager alarmManager;
DatabaseManager databaseManager;
MyMain() {
alarmManager = new AlarmManager(dataBaseManager);
databaseManager = new DatabaseManager (alarmManager);
}
AlarmManager getAlarmManager() {
return alarmManager;
}
DatabaseManager getDatabasetManager() {
return databaseManager;
}
}
Run Code Online (Sandbox Code Playgroud)
和班级:
AlarmManager {
DatabaseManager dataBaseManager;
onAlarm(alarm) {
dataBaseManager.saveInHistorical(alarm);
sendAlarm(alarm);
}
sendAlarm(alarm) {
socketWriter(alarm);
}
}
DatabaseManager{
AlarmManager alarmManager;
onDatabaseConnectionError() {
saveInHistorical(databaseAlarm);
alarmManager.sendAlarm(databaseAlarm);
}
saveInHistorical(historical) {
connection.store(historical);
}
}
Run Code Online (Sandbox Code Playgroud)
我想你通过查看代码得到了这个想法.如果有警报,我们会在AlarmManager中收到警报,但需要将其保存在历史数据库中.但是,如果我们与历史数据库有连接错误,我们还需要发送警报.
这真的是一个循环引用,其中main有报警但是报警也有主要和数据库/ main相同?你会如何解决它?
小智 2
我在做CAD开发时也遇到过类似的问题。在每个 Electronic CAD 中,都有一些组件端口和代表端口之间连接的信号线。线路和端口是多对多连接:每条线路必须维护一个绑定在一起的端口列表,并且端口必须注意附加到它们的线路。因此,每次用户想要连接两个端口时,他都会创建一条线路并将该线路连接到每个端口:
line.add(port)
port.add(line)
Run Code Online (Sandbox Code Playgroud)
这两个操作必须始终一起执行。这意味着它们必须被抽象为一个过程:调用line.add(port)将自动调用port.add(line),并且根据对称性,port.add(line)应该调用line.add(port)。好吧,我们正处于恶性循环中,这正是您问题中的问题!
我困扰了我很多年,但除了放弃对称性之外,我没有做任何更好的事情。line.add我只向用户公开,port.add将其调用的 隐藏在我的网表操作 API 后面。这样,port.add就不需要回电line.add,因为我们知道我们处于其中port.add只是因为line.add已经发生了。
port.add我可以通过引入 public和来恢复对称性line.add,这将调用 API-privateline.onAdd(port)和port.onAdd(line)回调。这似乎也微不足道。然而,你问这个问题是对的。我鼓励您对我的回复投赞成票,但不接受。我想自己知道正确的(OOP)答案。