1. 程式人生 > >OOP程式設計之is-a、has-a和is-like-a之間的關係

OOP程式設計之is-a、has-a和is-like-a之間的關係

概要:本文主要討論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關係。