其中一個recommended principles of object-oriented programming是Liskov substitution principle:子類的行爲應與其基類相同(警告:實際上這不是Liskov原理的正確描述:請參閱PS)。類繼承:構造函數應該兼容嗎?多重繼承的情況?
是否建議它也適用於構造函數?我主要考慮Python和它的__init__()
方法,但這個問題適用於任何具有繼承的面嚮對象語言。
我在問這個問題,因爲有一個子類繼承一個或多個提供一些很好的默認行爲的類是有用的(就像在Python中從字典繼承,所以obj['key']
適用於新類的對象)。然而,讓子類完全像字典一樣使用並不總是自然的或簡單的:有時更好的是構造函數參數只與特定的用戶子類相關(例如,代表一組串行端口的類可能想要像ports['usb1']
作爲USB端口#1的字典那樣)。對於這種情況推薦的方法是什麼?具有與其基類完全兼容的子類構造函數,並通過一個對象工廠函數生成實例,該函數採用簡單的,用戶友好的參數?或者簡單地寫一個類構造函數,它的參數集不能直接賦給它的基類的構造函數,但是從用戶的角度來看更合理?
PS:我曲解了Liskov的原則,上面:下面斯文的評論指出一個事實,即對象子類的應該表現得像超(子類本身並沒有表現得像超類的對象;特別是它們的構造函數不必具有相同的參數[簽名])。
@SvenMarnach:你的評論應該是被接受的答案。 –
@SvenMarnach:+1:確實如此。如果你寫一個答案,我會很樂意提出你的答案(請做!)。當你回答我的一個主要問題時,我也可以將其標記爲已被接受。 – EOL