2013-05-30 233 views
0

最近,我發現了一個令人費解的(對我來說)問題:比方說,我有一個類的層次結構C ... C_ n。假設至少某些類有多個(直接)子類,但沒有多個父類(即沒有多重繼承)。我想改變層次結構的行爲。我的第一個衝動是創建子類D ... D n並根據需要重寫方法,但有一個問題:當調用新重寫的方法時,可能需要將實際的D i作爲正式的D (或之間的某個級別);這可以通過子類C1 -> D1 -> D2 ...來解決。但是,當調用未改變的方法時,任何實際的需要作爲正式C ,因此我們必須直接從Ci導出每個D i。有沒有優雅的或普遍接受的方式來解決這個謎題?如果是這樣,有沒有辦法訴諸多重繼承?擴展類層次結構

如果沒有通用的方法來實現這一點,原始C層次結構的作者是否可以遵循某些規則來提供這種可能性?

對於那些更喜歡更實用的方法,原始層次結構在Ada中實現SOAP。我正在研究XML-RPC。從抽象的角度來看,SOAP是XML-RPC的超集,但實際的「在線」上的XML是完全不同的。原則上,可以通過丟棄一些數據類型來執行大部分工作(例如,XML-RPC有一個整數和一個浮點類型,而SOAP每個都有幾個),並將其餘類型轉換成的例程替換爲來自XML。 但是,由於上述繼承問題,我最終複製了幾乎整個SOAP層次結構。我已經能夠正確地重用的唯一代碼原來就是HTTP部分(因爲它不僅僅涉及文本有效載荷,而且涉及SOAP對象)。

[編輯:刪除了一個簡化的假設將允許並不適用於更一般的問題的簡單解決方案]

回答

2

的解決方案,因爲你承擔單一繼承,並直接子類的關係,是剛剛創建d( 1)作爲C(n)的子類,在這種情況下,所有D也將在每個C類中。

實際上,解決方案不是無故創建深層類層次結構。如果你真的進入了小型課堂,那麼使用一種能夠以某種形式容納多重繼承的系統。

+0

+1爲快速響應,以及簡單的解決方案。不幸的是,這只是簡單的,因爲我過於簡單化了,並不認爲這會引入新的解決方案。 –

+0

@AnsgarEsztermann不是。我認爲這個問題實際上並不存在,我挑戰你展示它出現的層次結構。 – Marcin