我來討論一下純理論的老問題.長方形和正方形的繼承關係.

siberian發表於2007-03-01
類的定義中,大家一直爭吵不休的就是正方形和長方形的關係.所說,正方形不是長方形的子類,因為它違反了長方形的行為.

然而計算機世界應當是當前世界在計算機中的對映.那麼我們來考察長方形和正方形的定義,長方形也就是矩形:為四個內角相等的平行四邊形。正方形,是平行四邊形;. 有一個角是直角;. 有一組鄰邊相等。

可是oo物件中,卻不能是繼承關係。為什麼?因為裡面的概念已經被偷換了,我們所定義的只是我們在某方面運用到的長方形和正方形。它的定義是全新的,包括了裡面所有的資料和所有的方法。不再是我們在數學中定義的長方形和正方形。

也就是說我們的oo定義的類,和現實世界不能完全對映上,只是反映其中我們想要得部分。它的定義是不完整的,過於簡單,無法反映資料和資料間的關係,契約太過強硬,只要是所用到的行為子類都要遵守。於是我們很著急,這違反了oo初衷。哲學上告訴我們片面的抽象擴大化,會走到我們所期望的反面。可以說這就是一個例子,原本現實分類中很明顯的繼承關係,反而到了oo中,不成立了,或者說成為一個問題。不象現實中那樣清晰。

我們為了簡化而把事情搞複雜了。也許我們在純粹的程式世界裡面還可以不大在意這件事,按照自己定義的就可以了。但是我們要做需求分析時,這就成為大問題。那是必須和現實世界對映上的,任何的扭曲都會帶來很多的麻煩。現在工作中我們的麻煩確實很多,原本清晰可見的關係,我們要重新調理。於是我們開始思考。

我們要用現實世界中的關係來指導oo設計,於是什麼LSP,DBC都冒出來告訴我們怎麼做。可是還是不行。

下一篇討論這個問題在做用例分析時可能造成的泥潭。如何迴避。

在我的blog:http://yingyiyy.blog.163.com/有後續文章。講談到這在工作中的實際意義。

相關文章