2010-04-07 40 views
5

我沒有想出一個更好的問題標題。現在讓我更好地解釋它:如何覆蓋嵌套的C++對象方法?

我正在開發的項目將連接到遠程服務器,加密會話併發送/接收數據包。 我想使它足夠模塊化,所以我認爲使用3個不同的類會很好。這些將是:

1)一個套接字包裝類與一些虛擬方法,如OnReceivedData()和OnConnected()。

2)套接字封裝器的繼承類,在數據發送和解密數據到達之前實現數據加密。 3)主對象本身應該根據需要加密或不加密的方式覆蓋上述任何一個類,因此它也可以接收OnReceivedData()和OnConnected()事件通知,並根據它。

所以問題是如何讓我的程序知道它必須首先調用加密對象上的事件,然後在主對象上調用相同的事件?因爲我猜如果我用加密重寫套接字包裝,然後用主對象覆蓋加密,它可能只是調用主對象方法(它會直接在主對象上調用OnReceivedData(),而不是通過解密對象第一,對吧?)。

這是否稱爲多重繼承?

順便說一句,如果你認爲這是一個糟糕的項目設計,我將不勝感激任何更好的方法。 感謝您花時間閱讀本文。

+0

我的建議是嘗試使用設計模式,例如'Builder'或'Factory'模式。 – 2010-04-07 20:39:03

回答

2

它不稱爲多重繼承(這是當一個類從多個超類繼承時)。它被稱爲方法覆蓋。在'主'OnReceivedData中,您可以通過限定其名稱EncryptedBaseClass::OnReceivedData()來明確調用'超級'方法。

這可能會變得凌亂。我推薦的是你反轉所有權,並讓加密類持有對套接字類的引用,符合decorator pattern(擁有加密裝飾器)。這將解決您的覆蓋問題,同時仍爲您提供所需的功能。

4

不要使加密對象成爲後代。讓它成爲修飾器代理。主要的對象不需要知道它是否是加密的東西。相反,它將擁有一個發送和接收數據的數據傳輸對象(套接字類),並且如果該數據傳輸對象恰好是在將數據傳遞給實際套接字對象之前加密數據的東西,那就這樣做。這不是主要目標的問題。

使用代理,加密類將具有與套接字對象相同的接口。它將包裝爲套接字對象,並且主對象將通過加密對象與套接字進行通信。如果您不想加密,則直接將套接字對象分配給主對象並跳過中間人。

使用裝飾器,主對象將直接與套接字對象通信,但套接字對象在通過加密對象發送它之前將通過加密對象運行所有內容。如果沒有裝飾器集合,那麼套接字對象會直接發送數據。

Fowler的設計模式包含裝飾器和代理,其中包括C++中的示例。