我没有找到问题的更好标题。让我现在更好地解释一下:
我正在处理的项目将连接到远程服务器,加密会话并发送/接收数据包。 我想让它足够模块化,所以我认为使用3个不同的类是很好的。这些将是:
1)一个套接字包装类,包含一些虚拟方法,如OnReceivedData()和OnConnected()。
2)套接字包装器的继承类,在发送数据之前实现数据加密,并在数据到达时解密数据。
3)主要对象本身应该覆盖上述任何一个类,具体取决于它是否需要加密,因此它也可以接收OnReceivedData()和OnConnected()事件通知并根据它进行操作
所以问题是如何让我的程序知道它必须首先在加密对象上调用事件然后在主对象上调用相同的事件?因为我想如果我用加密覆盖套接字换行器然后用主对象覆盖加密,它可能只调用主对象方法(它将直接在主对象上调用OnReceivedData(),而不是通过解密对象首先,对吧?)。
这称为多重继承吗?
如果您认为这是一个糟糕的项目设计,我会很感激任何更好的方法。 感谢您抽出宝贵时间阅读本文。答案 0 :(得分:4)
不要使加密对象成为后代。将其设为装饰器或代理。主要对象不应该知道它是否在加密事物。相反,它将有一个发送和接收数据的数据传输对象(套接字类),如果该数据传输对象碰巧是在将数据传递给真正的套接字对象之前对数据进行加密的,那就这样吧。这与主要对象无关。
使用代理,加密类将具有与套接字对象相同的接口。它将 wrap 套接字对象,主对象将通过加密对象与套接字通信。如果您不想加密,则直接将套接字对象分配给主对象,并跳过中间人。
使用装饰器,主对象将直接与套接字对象通信,但套接字对象将通过加密对象运行所有内容,然后再沿着线路发送。如果没有设置装饰器,则套接字对象将直接发送数据。
装饰器和代理包含在Fowler的设计模式中,其中包含C ++中的示例。
答案 1 :(得分:2)
它不被称为多重继承(这是当一个类从多个超类继承时)。它被称为方法覆盖。在“主要”OnReceivedData中,您可以通过限定其名称EncryptedBaseClass::OnReceivedData()
来明确调用“超级”方法。
这可能会变得混乱。我建议您反转所有权并让加密类保持对套接字类的引用,与decorator pattern(具有加密装饰器)一致。这将解决您的覆盖问题,同时仍然提供您所寻求的功能。