我在程序中有一個設計問題,這是由於abstract
基地有一個方法帶有一個位置(因此是可選的)參數。如何在方法有可選參數時不違反Liskov替換原則?
比方說這個班級是A
,方法是void f(x, [y]);
。現在,y
是可選的,因爲我已經知道一些A
的子類將使用它,其中一些不會。
實際的問題是違反了里氏替換原則:在需要y
子類我不得不拋出一個異常,如果不提供y
,而在A.f
(這是未實現的),我不拋出任何異常。
A
的設計也不好,因爲我提供了一個方法f
,其中一些子類真的需要它,其中一些需要稍微不同的版本。顯然,我應該儘可能小地設計我的接口(接口隔離)。
這實際上是一個普遍的問題,不僅與飛鏢有關。
那麼,如何處理可選參數以避免違反Liskov替換原則?特別是,您將如何處理我的情況,以便我也不違反界面隔離原則?
唯一可行的解決方案(我的具體問題),我現在看到的是使延長A
和實際f
需要y
實際延長(或實現,如果A
實際上是一個接口),另一個基類電流子方法f(x, y)
,這是兩個參數都是必需的。但是如何處理可選參數的問題仍然存在!
參數x和y有什麼共同點嗎?也許你可以把它們「包裝」成一種新的類型。這樣你就只有'f'的一個參數。 –
@JanezKuhar我也想過這個選項,但是創建另一個類型只是爲了明顯地解決這個參數問題,它看起來像一個黑客,因爲問題實際上依然存在,也就是'A的子類'f' '最初需要'y'(現在已經打包了另一個類型),如果'y'沒有被傳遞,仍然會拋出異常,而不需要'y'的其他子類不會。 – nbro
這是真的 - 只是掩蓋了問題。 –