如何使对象彼此通信?

时间:2019-03-15 21:25:27

标签: c++ oop

在过去的几周中,我一直在思考一种使不相关的对象相互通信的方法。尽管我已经找到了使其工作的几种方法,但它们似乎都显得有些古怪或过于复杂。

一种可行的解决方案是创建某种充当“调解员”角色的超类,检查其成员对象的状态并做出相应的响应。

struct SuperClass {
    Car playerCar;
    Police police;

    void update() { if(playerCar.exceedsSpeed()) { police.call(); } }
};

尽管这在简单的程序中可以很好地工作,但这种设计往往会使复杂性变得混乱。随着创建更多不同的对象类型,需要更多的超类或中级超类。最终,您得到了一个严格的类层次结构,这很难维护。

另一种解决方案是将对象的引用作为参数传递。

struct Car {
    Police* pPolice;
    Car(Police* obj) { pPolice = obj; }
};

Police police;
Car playerCar(&police);

每个对Police::call()的调用都可以通过pPolice进行,但是此解决方案有两个问题。

首先,Car结构现在没有任何意义。如果每辆汽车都有colormanufacturermaxSpeed等各种特征,那么为什么每辆汽车都有police?由于对象是包含特定于该对象类型的变量的结构,因此在这些变量中包含完全不相关的变量会破坏OOP的美观性。

第二,如果Car需要调用的对象的方法不仅仅是police.call(),我现在需要传递更多的引用作为参数。

Car playerCar(&police, &anotherObj, &yetAnotherObj...)

...这真是愚蠢。

相反,我希望能够在本地调用适当的方法。

void Car::accelerate() {
    speed++;
    if (speed > maxSpeed) { Mediator::callPolice(); }
};

我该怎么做?那可能吗?那是正确的方法吗?

2 个答案:

答案 0 :(得分:2)

好像您通常有两种情况。

一个是警察抓到超速驾驶的人。他们不会叫警察报告自己-而是一个警官可以在某个区域内观察,并且在经过该区域时如果汽车超过了限制(并且该警员没有被其他人占用) ,他被抓到并获得了罚单(或其他证明)。

第二,是汽车的驾驶员决定报警(例如发生事故)。在这种情况下,有一个类似于“调解员”的类。具体来说,有一个代表电话系统的类,驾驶员(或其他看见的驾驶员)使用他们的电话报警。如果没有人拿着电话看到事件,那么警察可能不会接到电话-或至少在驾驶员找到有人拿着电话时会有所延迟。

答案 1 :(得分:0)

在“警察”结构内创建一个公共静态方法“ callPolice”。然后,您可以从Car结构体中的方法调用它。如果“ callPolice”方法的主体不需要在特定的Police对象的实例上执行,这将对您有用。