(Translated by https://www.hiragana.jp/)
多态 (计算机科学) - 维基百科,自由的百科全书

态 (计算つくえ科学かがく)

ほどじょ设计语言あずか类型

ざい编程语言类型论なか英語えいごpolymorphismゆび不同ふどうかずすえ类型てき实体提供ていきょう统一てきせっこう[1]ある使用しよう一个单一的符号来表示多个不同的类型[2]

态的さいつね见主よう类别ゆう

  • とく设多态:为个たいてき特定とくてい类型てき任意にんい集合しゅうごうてい义一个共どうせっこう
  • まいり数多すうた指定していいち个或个类がたもたれ名字みょうじ而是もたれ以标识任なん类型てき抽象ちゅうしょう符号ふごう
  • 类型(也叫做子类型态或包含ほうがん态):一个名字指称很多不同的类的实例,这些类有ぼう共同きょうどうてきちょう[3]

历史

编辑

ざい1967ねん英国えいこく计算つくえ科学かがくかつさと斯托どる·斯特かみなりざいてき讲义ごうしゅう编程语言ちゅうてきもと概念がいねんえいFundamental Concepts in Programming Languagesちゅう[4]しゅ提出ていしゅつりょうとく设多态和さん数多すうた态的概念がいねんとく设多态是Algol 68てきとくせい,而参数多すうた态是MLざい1975ねん介入かいにゅうてき类型けい统的核心かくしんとくせい[5]

ざい1985ねんかれとく·かわらかくえいPeter Wegner卢卡·卡代えいLuca Cardelliざい论文ちゅう引入りょう术语「包含ほうがん态」らい类型继承けん[2],引证1967ねんてきSimula为子类型继承てき最早もはやてき对应实现。

类别

编辑

とく设多态

编辑

かつさと斯托どる·斯特かみなり选择术语“とく设多态”らいゆびしょう一个多态函数可以应用于有不同类型的实际参数上,ただし以来いらい它们しょ应用いたてき实际さんすう类型而有不同ふどうてきひょう现(也叫做为はこすうじゅうある运算じゅう[6]ざい这个上下じょうげ文中ぶんちゅう术语“とく设”(ad hoc不意ふい图表达贬义,它只简单てき指出さしで这种态不类型けい统的基本きほんとくせいざい下面かめんてきPascal/Delphiれい子中こなかざい查看Add函数かんすうてき调用てき时候,它好ぞう通用つうようてき工作こうさくざいかく种类がたうえただし编译对所有意ゆうい图和用途ようと它们视为完全かんぜん不同ふどうてき两个函数かんすう:

program Adhoc;

function Add(x, y : Integer) : Integer;
begin
    Add := x + y
end;

function Add(s, t : String) : String;
begin
    Add := Concat(s, t)
end;

begin
    Writeln(Add(1, 2));                   (* しるし"3"             *)
    Writeln(Add('Hello, ', 'Mammals!'));    (* しるし"Hello, Mammals!" *)
end.

ざい动态类型语言ちゅうじょう可能かのうさら复杂,いん为需よう调用てきせい确函すうただのうざい运行时间确定。

隐式类型转换也被てい义为态的いち种形しきさけべ做“强迫きょうはく态”[2][7]

まいり数多すうた

编辑

まいり数多すうた态允许函すうあるかずすえ类型一般いっぱんせいてき书写,从而它可以“统一”てき处理值而不用ふよう赖于它们てき类型[8]まいり数多すうた态是使语言さらゆうひょう现力而仍维持完全かんぜんてきせい类型安全あんぜんてきいち种方しき。这种函数かんすうすうすえ类型ぶん别称为“泛化函数かんすうかず“泛化すうすえ类型”从而形成けいせいりょう泛型编程てきもと础。

れい如,以构づくり连接两个れつひょうてきいち个函すうappend,它不关心元素げんそてき类型:它可以附加ふか整数せいすうてきれつひょう、实数てきれつひょうくしてきれつひょうとうとう。设定“类型变量aらい指定してい这个れつひょう中元ちゅうげん素的すてき类型。接着せっちゃくappend以确てい类型:

forall a. [a] × [a] -> [a]

这里てき[a]指示しじ具有ぐゆう类型aてき元素げんそてきれつひょう类型。わが们称对于aてき所有しょゆうてき值,appendてき类型“ゆかりaさんすう”。结果てきれつひょう必须よししょうどう类型てき元素げんそ组成。对于应用appendまとごと位置いちようa确定いち个值。

まいり数多すうた态的概念がいねん适用于かずすえ类型函数かんすうしゃ以被もとめ值或应用于不どう类型てき值之じょうてき函数かんすうさけべ做“态函すう”。おこりらい具有ぐゆう泛化类型せい质的すうすえ类型(具有ぐゆう任意にんい类型てき元素げんそてきれつひょうゆび认为“态数すえ类型”,就像すえ它来做特殊とくしゅてき泛化类型样。

まいり数多すうた态在函数かんすうしき编程これちゅう普遍ふへんてきざい这里它经つね简称为“态”。下面かめんてきHaskellれい展示てんじりょうさんすうれつひょうすうすえ类型ざい其上てき两个さん数多すうた态函すう

data List a = Nil | Cons a (List a)

length :: List a -> Integer
length Nil         = 0
length (Cons x xs) = 1 + length xs

map :: (a -> b) -> List a -> List b
map f Nil         = Nil
map f (Cons x xs) = Cons (f x) (map f xs)

まいり数多すうた态在很多めんこう对象语言ちゅう也能获得いたれい如,C++DてきばんかずざいC#DelphiJavaちゅうしょしょう谓的泛型:

class List<T> {
    class Node<T> {
        T elem;
        Node<T> next;
    }
    Node<T> head;
    int length() { ... }
}

List<B> map(Func<A, B> f, List<A> xs) {
    ...
}

John C. ReynoldsえいJohn C. ReynoldsきさきらいてきJean-Yves GirardえいJean-Yves Girard正式せいしきてきはた这种概念がいねん发展为对lambda演算えんざんてき扩展(さけべ做多态lambda演算えんざんあるけい统F)。にんなんさん数多すうた态函すう必然ひつぜんざいのう做什么上受到げんせい工作こうさくざいすうすえてき形状けいじょう而不它的值之じょう,这导致了parametricityえいparametricityてき概念がいねん

类型

编辑

ざいめんこう对象ほどじょ设计なか计算つくえほどじょ執行しっこうあいどうてき訊息可能かのうかいおくきゅう不同ふどうてき類別るいべつ物件ぶっけん,而系統けいとう依據いきょ物件ぶっけん所屬しょぞく類別るいべつ,引發對應たいおう類別るいべつてき方法ほうほう,而有不同ふどうてき行為こうい簡單かんたんせつ所謂いわゆるがたゆびしょうどうてき訊息きゅう不同ふどうてき物件ぶっけんかい引發不同ふどうてき動作どうさ如有動物どうぶつ類別るいべつ,而且よし動物どうぶつ繼承けいしょう類別るいべつ貓和類別るいべついぬなみたい同一どういつげん類別るいべつ動物どうぶつちち類別るいべつ一訊息有不同的響應,如類べつ動物どうぶつゆうさけべ動作どうさ,而類べつ貓會「喵喵」,類別るいべついぬそくかいひろしひろし」,のりしょうためがたたい

ざい下面かめんてき这个れい子中こなかねこいぬ动物てき类型。过程letsHear()接受せつじゅいち个动ぶつただしざい传递给它一个子类型的时候也能正确工作:

abstract class Animal {
    abstract String talk();
}

class Cat extends Animal {
    String talk() {
        return "Meow!";
    }
}

class Dog extends Animal {
    String talk() {
        return "Woof!";
    }
}

static void letsHear(final Animal a) {
    println(a.talk());
}

static void main(String[] args) {
    letsHear(new Cat());
    letsHear(new Dog());
}

态可ぶん为变りょう态与函数かんすう态。变量态是ゆびもと类型てき变量(对于C++引用いんようあるゆび针)以被赋值もと类型对象,也可以被赋值派生はせい类型てき对象。函数かんすう态是ゆびそうどうてき函数かんすう调用界面かいめん函数かんすうめいあずか实参ひょう),传送给一个对象变量,以有不同ふどうてきぎょう为,这视该对ぞう变量しょ指向しこうてき对象类型而定。态也てい义为“一种将不同的特殊行为和单个泛化记号相关联的能力”,变量态是函数かんすう态的もと础。

实现角度かくど类别

编辑

すえ实现时做てき选择,态可ぶん为:

  • 动态态(dynamic polymorphism):なまこう运行
  • せい态多态(static polymorphism):はた不同ふどうてき特殊とくしゅぎょう为和单个泛化记号しょう关联,ゆかり于这种关联处编译而非运行いん此被しょう为“せい态”。以用らい实现类型安全あんぜん、运行だかこうてきどう质对ぞう集合しゅうごう操作そうさ。C++ STLさいよう动态态来实现就是个例

对于C++语言,带变量的りょうてき宏和こうわはこすうじゅう载机せい也允许将不同ふどうてき特殊とくしゅぎょう为和单个泛化记号しょう关联。しか而,习惯じょう并不はた这种函数かんすう态、ひろし态展现出来できてきぎょう为称为多态(あるせい态多态),いや则就连C语言具有ぐゆうひろし态了。谈及态时,だま认就ゆび动态态,而静态多态则ゆびもと于模いたてき态。

まいり

编辑

参考さんこう资料

编辑
  1. ^ Bjarne Stroustrup. Bjarne Stroustrup's C++ Glossary. February 19, 2007 [2018-06-29]. (原始げんし内容ないようそん于2018-06-29). polymorphism – providing a single interface to entities of different types. 
  2. ^ 2.0 2.1 2.2 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 [2018-06-29]. ISSN 0360-0300. doi:10.1145/6041.6042. (原始げんし内容ないよう (PDF)そん档于2019-10-14). : "Polymorphic types are types whose operations are applicable to values of more than one type."
  3. ^ Booch, et al 2007 Object-Oriented Analysis and Design with Applications. Addison-Wesley.
  4. ^ Strachey, Christopher. Fundamental Concepts in Programming Languages. Higher-Order and Symbolic Computation. 2000, 13 (1/2): 11–49. ISSN 1573-0557. doi:10.1023/A:1010000313106. 
  5. ^ Milner, R., Morris, L., Newey, M. "A Logic for Computable Functions with reflexive and polymorphic types", Proc. Conference on Proving and Improving Programs, Arc-et-Senans (1975)
  6. ^ Christopher Strachey. Fundamental Concepts in Programming Languages (PDF). www.itu.dk (Kluwer Academic Publishers). [2012-10-13]. (原始げんし内容ないようそん (PDF)于2017-08-12). 
  7. ^ Allen B. Tucker. Computer Science Handbook, Second Edition. Taylor & Francis. 28 June 2004: 91– [2021-02-06]. ISBN 978-1-58488-360-9. (原始げんし内容ないようそん于2017-03-31). 
  8. ^ Pierce, B. C. 2002 Types and Programming Languages. MIT Press.