OOP程式設計之is-a、has-a和is-like-a之間的關係
阿新 • • 發佈:2018-12-31
概要:本文主要討論is-a和has-a以及is-a和is-like-a之間的關係。
OOP程式設計思想中,繼承是一個十分重要的內容。下面介紹幾個 常見的容易混淆的術語。
首先舉例子:
我們常見的動物,羊有很多種類,只是一種泛指,綿羊是其中一種,那麼羊和綿羊的關係,就是is-a,即它們是繼承的關係。
再如,羊身上都有羊毛,而不同種類的羊,羊毛生物形態也不同,比如綿羊和羚羊,前者羊毛豐富、蓬鬆、柔軟,呈白色;後者羊毛稀少、剛硬,呈灰褐色。對於綿羊來說,羊毛和羊的關係就是has-a。對於羚羊也是同理。我們可以根據羊毛的不同,來區別羊的品種。
用自然語言來表述二者:
is-a: 這種事物(綿羊)是那種事物(羊)中的一個種類。
has-a:這種事物(羊毛)隸屬於那種事物(綿羊),是它的一個部分、部件。
這種思想在OOP上,體現在哪方面呢?答案就是抽象類和介面的關係。
如下圖:
圖1 is-a與has-a之間的關係
可以看到 MyClass 繼承自 A,它們是is-a關係。
MyClass實現了介面I,它們是has-a關係。
-------------------------------------俺是很華麗的分割線-------------------------------------
那麼is-a和is-like-a啥關係呢?
同樣,舉例子,如圖:
類B
總結就是:
如果繼承過程中,僅僅是覆蓋了父類中的方法,則為is-a關係。
如果有新增的方法,則為is-like-a關係。