【问题标题】:How to override nested C++ objects methods?如何覆盖嵌套的 C++ 对象方法?
【发布时间】:2011-02-05 10:43:20
【问题描述】:

我没有为这个问题找到更好的标题。现在让我更好地解释一下:

我正在进行的项目将连接到远程服务器,加密会话并发送/接收数据包。 我想让它足够模块化,所以我认为使用 3 个不同的类会很好。这些将是:

1) 带有一些虚方法的套接字包装类,例如 OnReceivedData() 和 OnConnected()。

2) 套接字包装器的继承类,实现数据发送前的加密和数据到达时的解密。

3) 主对象本身,它应该根据是否需要加密覆盖上述任何一个类,因此它也可以接收 OnReceivedData() 和 OnConnected() 事件通知并根据它采取行动.

所以问题是我如何让我的程序知道它必须首先在加密对象上调用事件,然后在主对象上调用相同的事件?因为我猜如果我用加密覆盖套接字包装器,然后用主对象覆盖加密,它可能只会调用主对象方法(它会直接在主对象上调用 OnReceivedData() ,而不是通过解密首先是对象,对吧?)。

这叫多重继承吗?

顺便说一句,如果您认为这是一个糟糕的项目设计,我将不胜感激任何更好的方法。 感谢您抽出宝贵时间阅读本文。

【问题讨论】:

  • 我的建议,尝试使用设计模式,例如BuilderFactory 模式。

标签: c++ methods notifications overriding


【解决方案1】:

不要使加密对象成为后代。使其成为装饰器代理。主要对象不需要知道它是否在加密事物。相反,它将有一个发送和接收数据的数据传输对象(套接字类),如果该数据传输对象恰好是在将数据传递给真正的套接字对象之前加密数据的东西,那就这样吧。这与主要对象无关。

使用代理,加密类将具有与套接字对象相同的接口。它将包装套接字对象,主对象将通过加密对象与套接字对话。如果不想加密,那么直接把socket对象赋值给主对象,跳过中间人。

使用装饰器,主对象将直接与套接字对象对话,但套接字对象会在通过网络发送加密对象之前运行所有内容。如果没有设置装饰器,则套接字对象将直接发送数据。

Fowler 的设计模式 中介绍了装饰器和代理,其中包括 C++ 中的示例。

【讨论】:

    【解决方案2】:

    不叫多重继承(这是一个类继承多个超类的情况)。它被称为方法覆盖。在您的“主要”OnReceivedData 中,您可以通过限定其名称EncryptedBaseClass::OnReceivedData() 来显式调用“超级”方法。

    这可能会变得混乱。我建议您反转所有权并让加密类持有对套接字类的引用,符合decorator pattern(拥有加密装饰器)。这将解决您的覆盖问题,同时仍为您提供所需的功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 2013-04-13
      • 2021-10-16
      • 1970-01-01
      相关资源
      最近更新 更多