本页使用了标题或全文手工转换

多型 (计算机科学)

维基百科,自由的百科全书
跳到导航 跳到搜索

编程语言类型论中,多型英语:polymorphism)指为不同数据类型的实体提供统一的接口[1]多态类型英语:polymorphic type)可以将自身所支持的操作套用到其它类型的值上。[2]

计算机程序執行時,相同的訊息可能會送給多個不同的類別之物件,而系統可依據物件所屬類別,引發對應類別的方法,而有不同的行為。簡單來說,所謂多型意指相同的訊息給予不同的物件會引發不同的動作。

多态也可定义为“一种将不同的特殊行为和单个泛化记号相关联的能力”。

多态可分为变量多态与函数多态。变量多态是指:基类型的变量(对于C++是引用或指针)可以被赋值基类型对象,也可以被赋值派生类型的对象。函数多态是指,相同的函数调用界面(函数名与实参表),传送给一个对象变量,可以有不同的行为,这视该对象变量所指向的对象类型而定。因此,变量多态是函数多态的基础。

多态还可分为:

  • 动态多态(dynamic polymorphism):通过类继承机制和虚函数机制生效于运行期。可以优雅地处理异质对象集合,只要其共同的基类定义了虚函数的接口。也被称为子类型多态(Subtype polymorphism)或包含多态(inclusion polymorphism)。在面向对象程序设计中,这被直接称为多态
  • 静态多态(static polymorphism):模板也允许将不同的特殊行为和单个泛化记号相关联,由于这种关联处理于编译期而非运行期,因此被称为“静态”。可以用来实现类型安全、运行高效的同质对象集合操作。C++ STL不采用动态多态来实现就是个例子。
    • 非参数化多态或译作特设多态(Ad-hoc polymorphism):
      • 函数重载(Function Overloading)
      • 运算符重载(Operator Overloading)
      • 带变量的宏多态(macro polymorphism)
    • 参数化多态(Parametric polymorphism):把类型作为参数的多态。在面向对象程序设计中,这被称作泛型编程

对于C++语言,带变量的宏和函数重载(function overload)机制也允许将不同的特殊行为和单个泛化记号相关联。然而,习惯上并不将这种函数多态(function polymorphism)、宏多态(macro polymorphism)展现出来的行为称为多态(或静态多态),否则就连C语言也具有宏多态了。谈及多态时,默认就是指动态多态,而静态多态则是指基于模板的多态。

历史[编辑]

1967 年,英国计算机科学家克里斯托弗·斯特雷奇在他的讲义合集《编程语言中的基础概念英语Fundamental Concepts in Programming Languages》中,首次提出了特设多态和参数多态的概念。[3]

1985 年,彼得·瓦格纳英语Peter Wegner卢卡·卡代利英语Luca Cardelli在论文中引入了术语「蕴含多态」(英语:inclusion polymorphism)来为子类型和继承 (计算机科学)建模。[2]。不过子类型和继承本身在 1967 年就已经在 Simula 有对应的实现。

例子[编辑]

比如有動物(Animal)之類別(Class),而且由動物繼承出類別雞(Chicken)和類別狗(Dog),並對同一源自類別動物(父類別)之一訊息有不同的響應,如類別動物有「叫()」之動作,而類別雞會「啼叫()」,類別狗則會「吠叫()」,則稱之為多型。

参见[编辑]

参考资料[编辑]

  1. ^ Bjarne Stroustrup. Bjarne Stroustrup's C++ Glossary. February 19, 2007. polymorphism – providing a single interface to entities of different types. 
  2. ^ 2.0 2.1 Cardelli, Luca; Wegner, Peter. On understanding types, data abstraction, and polymorphism (PDF). ACM Computing Surveys (New York, NY, USA: ACM). December 1985, 17 (4): 471–523. ISSN 0360-0300. doi:10.1145/6041.6042. : "Polymorphic types are types whose operations are applicable to values of more than one type."
  3. ^ Christopher Strachey. Fundamental Concepts in Programming Languages (PDF). www.itu.dk (Kluwer Academic Publishers).