我是OO設計/編程新手,有一個問題我相信是關於類設計的。我會用我的術語來精確。類設計和繼承
[編輯] 也許歸結爲這樣:我有一個基類類型的對象列表。派生類是作爲實現基類方法的基類的特定類型創建的,而某些派生類具有特定於派生類型的附加參數和/或方法。當我橫過列表時,我正在使用基類參考。什麼是訪問特定變體類的方法和參數的好方法?切換語句並投射?這不是C#中的這種糟糕的形式,並且在類設計中提出缺陷嗎?假設我正在編寫一個使用基類「shape」和類「circle」,「triangle」的圖形程序,和「形狀」派生的「方形」。根據Stroustrup的說法,基類必須包含爲形狀類實現「全套操作」所需的成員函數。在大多數情況下,這些成員函數將是虛擬的,以便派生類可以實現特定於其形狀的功能,例如:加載,保存,繪製,旋轉,更新等。這對我來說都是有意義的。
我陷入困境的地方在於形狀類型之間的細微差別以及這些差異對基類的影響。例如,考慮特定於派生形狀的成員函數。假設「圓」形狀具有描述用多少線段來近似圓的值(例如lineCount)。我如何處理設置和更新這個值的方式,不會以虛擬成員函數從每個派生類的特定需求中「冒泡」開始污染我的基類?
我問這是因爲期望保持一個類型「形狀」的列表來跟蹤我的所有對象。我不希望列出類型爲「circle」,「triangle」和「square」的地方,直接訪問圓圈特定的lineCount值,並且不會讓這些單獨的列表無論如何違反繼承的整個想法隱式或明確地引入switch語句的等價物以及每種形狀類型的案例?
爲了解決這個問題,我在正確的軌道上認爲除了像「draw」這樣明顯的成員函數之外,我還必須深入思考「全套操作」的要求。所以如果我有一個形狀特定的值(例如圓形的lineCount),它必須可以通過形狀的成員函數來獲得/設置該值的一般方式,與其他(可能不同)其他形狀類型。因此,我只能認爲形狀類必須包含一個通用參數設置功能,可以包括要求每個派生類呈現其自己的UI形式,以請求其特定形狀的特定參數。形狀類的要求包括UI成員函數感覺就像形狀類變得太重了。
我在想這個方法嗎?有更好的方法來處理派生類中的細微差異嗎?
解決這個問題的一種方法是爲配置數據配置'std :: map'(或'Dictionary'),並且可以調用一個虛擬'configure'函數來傳遞每種形狀類型所需的數據。 –
所有的子類都應該在基類中實現「全套操作」。但這並不意味着基類應該支持任何子類可能擁有的所有操作。只需將這些函數放入需要它的子類中即可。 – user2079303
Zac,您的評論與解決所有需要lineCount值的特殊問題有關,其中一個lineCount值存儲爲配置參數可應用於所有圈子。如果是這樣,我相信我明白你在說什麼。但是我的問題更一般,每種特定的形狀類型都有其獨特的獨特價值。是否有比「完整的操作」更好的解決方案,或者對列表中存儲的類型對象使用強制轉換/開關語句? – BobC