繼承的二三事

二月 10, 2007 on 2:49 am | In c++ |

熟悉c++的人, 都知道要儘量謹慎使用多重繼承. 在Scott Meyers 的 effective c++(3e) Item 40有相關的說明. 那單一繼承呢?

STL 之父Alexander Stepanov 在這裏這麼說, "I think that object orientedness is almost as much of a hoax as Artificial Intelligence.", 對喜好OO的人來說, 一時還真不能接受. 但看看STL, 除了 iostrem, 幾乎看不到繼承. 在同篇文章中, 他評論java時, 也曾提過, java 保留了他不會用到的c++功能(繼承,virtual), 卻移除了他認為有用的功能.

再看看 Bjarne Stroustrup 怎麼說 "You try not to overuse inheritance. When you do use inheritance, you try not to use to overuse multiple inheritance. And when you do use multiple inheritance, you try to avoid the more complicated variations. "
也許有些人會覺得 A. Stepanov 的話太偏激, 但綜合以上兩位大師的話, 至少在使用繼承前, 要謹慎考慮一下是否有別的替代方法. 就像你會謹慎的使用多重繼承一樣. 多重繼承對Java而言, 是種被拒絕的壞味道. 而對Bjarne 來說, 許多c++的特性(如多重繼承), 是為了讓c++能支援多重編程風格. 你可以選擇使用與否, 但在某些特定的狀況下, 少了這個特性, 將無法寫出簡潔明確的程式碼. 而上面他的這段話, 相對也暗示了繼承的謹慎使用.

問題是這個繼承的謹慎使用, 標準是訂在每個人自己心中. 繼承法則大部份人都知道, 表示" is-a" 用public inheritance , 表示"has-a" 用delegation , 表示 "is-implemented-in-terms-of" 儘可能用delegation , 不能時再用 private inheritance.
註 : aggregation,composition, delegation, layering, 指的是同一件事.
is-a 參見 Liskov substitution principle

而遵守這些原則, 仍然有可能使用到不好的繼承. 這裏說的不好的繼承, 並不是說繼承原則用錯了, 而是說在大型系統中, 這樣的繼承體系, 可能會喪失一些彈性及效能. 只是在大部份人面臨的開發環境中, 這種缺點不容易被發現, 而繼承這個方便的優點, 卻是每個人都知道的.

這個標準尺很難拿捏, 有機會再提幾個例子, 先收工了.

No Comments yet »

使用 RSS 訂閱本文留言回應 TrackBack 引用通告網址URI

留下回應

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

Powered by WordPress with Pool theme design by Borja Fernandez.
Entries and comments feeds. Valid XHTML and CSS. ^Top^