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