我一直在尋找這個問題的答案--在這個論壇上和一般的互聯網上。雖然我已經找到了討論類似主題的帖子,但我正處于需要做出一些設計選擇的階段,我想知道我的方法是否正確,具體如下:
在 C 中,我創建了 3 個資料結構。
在 C 中,我創建了 3 個資料結構。一個鏈接串列、一個二叉樹和一個網格。我希望能夠在這些資料結構中存盤不同的類--一個可能是操作字串的類,另一個是數字,等等。現在,分配給節點的這些類中的每一個都具有執行和處理標準不等式運算子的比較操作的能力。
我認為C 的繼承性將為這個問題提供完美的解決方案--它將允許一個基礎 "資料類"(抽象類)和所有其他資料類,如JString,從它繼承。因此,這個資料類將有以下的不等式方法:
virtual bool isGreaterThan(const dataStructure & otherData) const = 0。
那么,JString將繼承自dataStructure,我們的愿望是覆寫這個方法,因為isGreaterThan顯然將根據類的不同而有不同的含義。然而,我所需要的是:
virtual bool isGreaterThan(const JString & otherData) const。
我知道這是不可能的,因為引數是不同的資料型別,而C 對虛擬方法的覆寫要求是這樣的。我看到的唯一解決方案是在JString中做這樣的事情:
virtual bool isGreaterThan(const dataStructure & otherData)。
{
this->isGreaterThanJString(dynamic_cast<const JString& > (theSourceData))。
};
virtual bool isGreaterThanJString(const JString & otherData) const。
換句話說,覆寫方法只是呼叫JString的等價物,將otherData向下轉換為JString物件,因為這將永遠是真實的,如果不是,它應該失敗。
我的問題是這樣的。這似乎是一個可以接受的策略,還是我在C 中錯過了一些能力。我也曾使用過模板,但我試圖避免這樣做,因為我發現除錯變得非常困難。另一個選擇是嘗試使用可以接受任何資料型別的void*,但這也會帶來一些問題,并將負擔轉移到代碼中,導致類的長度增加。
uj5u.com熱心網友回復:
LSP意味著對基類的參考的操作必須有效,并且在這些操作具有參考多型性時,對基類和派生類實體的操作具有相同的語意。
你的例子沒有通過這個測驗。 基類 isGreaterThan 聲稱對所有 dataStructure 都有效,但它并沒有。
我將在你的容器中制作 dataStructure 的引數型別模板。 然后你就會知道存盤資料的具體型別。
看看 std list,了解一下鏈接串列模板可能是什么樣子。
現在我將介紹在上述建議不正確的 0.1% 的情況下你可以采取的復雜的額外步驟。
如果這導致了問題,因為模板膨脹,你可以創建一個多型的容器,通過薄的模板封裝或運行時測驗來強制執行存盤資料的型別。 一旦存盤,你就會盲目地投向已知的存盤型別,并在 C 或 C 風格的多型方法中存盤如何復制/比較/等所述型別。
這里有一個8年前關于這種方法的有趣談話。https://channel9.msdn.com/Events/GoingNative/2013/Inheritance-Is-The-Base-Class-of-Evil
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318597.html
標籤:
