在面向對象設計、面向對象程序設計等領域,
Is-a
描述的是類的父子繼承關系。
當一個類S繼承另外一個類F時,我們一般會說這是子類S繼承父類F,或說類F是類S的父類。換句話說即為
S is a F .
S被包含在F內,或說F包含S。更為一般得說,概念體S物是概念體F物的特殊化,而概念體S物是概念體F物的一般化。
舉例:
三角形是一個多邊形;外科醫生是一個醫生;蘋果是一個水果······
那如果說
黑板是一個教室。
顯然,黑板怎么可能是教室呢?這明顯不滿足‘Is-a’關系。但是退一步思考,黑板和教室的確是有關聯的,這點是不可否認的。只是它們之間的關系并非‘Is-a’,而是‘Has-a’。
如果說
教室有一個黑板。
這樣就更加符合邏輯了,在面向對象程序設計中,這表示教室帶有黑板的實例變量。也就是說教室會有一個黑板的引用,但是教室并沒有繼承黑板。
Summary:
在實際面向對象編程過程中,如果想知道某物是否應該繼承另一物時,就可以使用‘Is-a’測試來檢驗。
Is-a測試適用于在繼承層次的任何地方。如果你的繼承層次樹設計得很好,那么所有的子類都應該通過任何一個上層父類的Is-a測試。
參考:
- Is-a 維基百科
- “Head First Java”(中文版)