is-a
在知識表示、面向對象程序設計與面向對象設計的領域裡,is-a(英語:subsumption,包容)指的是在抽象(比如類別或類型)之間體現的包容關係。例如類別D是另一個類別B的子類別(類別B是類別D的父類別),則D被包容在B內。換句話說,通常"D is a B"指的是,概念體D物是概念體B物的特殊化,而概念體B物是概念體D物的廣泛化[1]。舉例來說,水果是蘋果、橘子、芒果與其他水果的廣泛化。
在面向對象程序設計裡,is-a類別關係是在繼承概念的背景之下所形成的。比如說,蘋果繼承(英語:inherit)水果的所有的屬性。is-a對比於has-a,後者是以整體-附屬階層關係所組成的。在真實世界裡設計一個模型時(例如計算機程序),尤其是物件與它的下一層從屬物件,在has-a與is-a兩者的關係上容易產生概念上的錯誤。is-a還可以是對比於instance-of,詳情可參考類型和個例的區別。
子類型的例子
子類型確使一個給定的類型被用於替換其他的類型或抽象。子類型被稱為建立了在子類型和某種現存抽象之間的is-a聯繫,要麼隱式要麼顯式,依賴於語言支持。這個聯繫在支持繼承作為子類型機制的語言中可以通過繼承來顯式表達。
C++
下列C++代碼建立在類B和A之間的顯式繼承聯繫,這裡的B是A的子類和子類型二者,並且在指定了B的任何地方(通過引用、指針或對象自身)B都可以作為A使用。
class A
{ public:
void DoSomethingALike() const {}
};
class B : public A
{ public:
void DoSomethingBLike() const {}
};
void UseAnA(A const& some_A)
{
some_A.DoSomethingALike();
}
void SomeFunc()
{
B b;
UseAnA(b); // b可以用于替换A.
}
Python
下列Python代碼建立在類B
和A
之間的顯式繼承聯繫,這裡的B
是A
的子類和子類型二者,並且在要求了B
的任何地方B
都可以作為A
使用。
class A:
def do_something_a_like(self):
pass
class B(A):
def do_something_b_like(self):
pass
def use_an_a(some_a):
some_a.do_something_a_like()
def some_func():
b = B()
use_an_a(b) # b可以被用来替代A.
在下列例子中,type(a)
是一個「正規」類型,而type(type(a))
是一個元類型(metatype)。儘管所有類型都分配了相同的元類型(PyType_Type
,它還是自身的元類型),這不是必需的。舊式的類,叫作types.ClassType
,也可以被當作不同的元類型[3]。
>>> a = 0
>>> type(a)
<type 'int'>
>>> type(type(a))
<type 'type'>
>>> type(type(type(a)))
<type 'type'>
>>> type(type(type(type(a))))
<type 'type'>
參見
引用
- ^ Subtypes and Subclasses (PDF). MIT OCW. [2 October 2012]. (原始內容存檔 (PDF)於2020-08-26).
- ^ Mitchell, John. 10 "Concepts in object-oriented languages". Concepts in programming language. Cambridge, UK: Cambridge University Press. 2002: 287. ISBN 0-521-78098-5.
- ^ Guido van Rossum. Subtyping Built-in Types. [2 October 2012]. (原始內容存檔於2020-05-14).
參考資料
- Ronald J. Brachman; What IS-A is and isn't. An Analysis of Taxonomic Links in Semantic Networks (頁面存檔備份,存於網際網路檔案館). IEEE Computer, 16 (10); October 1983
- Jean-Luc Hainaut, Jean-Marc Hick, Vincent Englebert, Jean Henrard, Didier Roland: Understanding Implementations of IS-A Relations. ER 1996: 42-57