在过去的几周里,我一直在想一种方法,让相当不相关的对象能够相互通信。虽然我已经找到了几种方法来实现它,但它们似乎都有些不够优雅或过于复杂。
其中一个可行的解决方案是创建某种父类(super class),它充当“中介”的角色,检查其成员对象的状态并做出相应的响应。
struct SuperClass {
Car playerCar;
Police police;
void update() { if(playerCar.exceedsSpeed()) { police.call(); } }
};
虽然这在简单的程序中可以很好地工作,但这种设计往往会因复杂性而变得困惑。随着创建更多不同的对象类型,需要更多的父类(super class)或中间父类(super class)。最终你会得到一个非常难以维护的严格的类层次结构。
另一种解决方案是将对象的引用作为参数传递。
struct Car {
Police* pPolice;
Car(Police* obj) { pPolice = obj; }
};
Police police;
Car playerCar(&police);
对 Police::call()
的每次调用都可以通过 pPolice
进行,但此解决方案存在两个问题。
首先,Car
结构现在没有任何意义。如果每辆车都有各种特征,例如color
、manufacturer
、maxSpeed
等等,为什么每辆车都有一个警察
?由于对象是包含特定于该对象类型的变量的结构,因此在这些变量中包含一个完全不相关的变量会破坏 OOP 的美感。
其次,如果 Car
需要调用更多对象的方法而不仅仅是 police.call()
,我现在需要将更多引用作为参数传递。
Car playerCar(&police, &anotherObj, &yetAnotherObj...)
...这很愚蠢。
相反,我希望能够在本地调用适当的方法。
void Car::accelerate() {
speed++;
if (speed > maxSpeed) { Mediator::callPolice(); }
};
我该怎么做?那可能吗?这是正确的方法吗?
最佳答案
似乎您通常有两种情况。
一个是警察抓到有人超速行驶。他们不会调用警察报告自己——相反,一名警察有一些他可以观察的区域,如果汽车在通过该区域时超过限制(并且警察没有其他任务) , 他被抓了并被开罚单(或其他什么)。
第二,汽车司机决定报警(例如,发生事故)。在这种情况下,有一个类似“中介”的类。具体来说,有一个类代表电话系统,司机(或看到的其他司机)使用他们的电话报警。如果没有人用电话看到这一事件,那么警察可能不会接到电话——或者至少在司机找到有电话的人时可能会有延迟。
关于c++ - 如何让对象相互通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55190863/