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++代码建立在类BA之间的显式继承联系,这里的BA的子类和子类型二者,并且在指定了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.
}

[2]

Python

下列Python代码建立在类BA之间的显式继承联系,这里的BA的子类和子类型二者,并且在要求了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'>

参见

引用

  1. ^ Subtypes and Subclasses (PDF). MIT OCW. [2 October 2012]. (原始内容存档 (PDF)于2020-08-26). 
  2. ^ Mitchell, John. 10 "Concepts in object-oriented languages". Concepts in programming language. Cambridge, UK: Cambridge University Press. 2002: 287. ISBN 0-521-78098-5. 
  3. ^ Guido van Rossum. Subtyping Built-in Types. [2 October 2012]. (原始内容存档于2020-05-14). 

參考資料