(Translated by https://www.hiragana.jp/)
泛型编程 - 维基百科,自由的百科全书 とべ转到内容ないよう

泛型编程

本页使用了标题或全文手工转换
维基百科ひゃっか自由じゆうてき百科ひゃっかぜん

泛型ほどじょ设计英文えいぶん:generic programmingこれほどじょ设计语言てきいち种风かくある范型。泛型まこと许程じょ员在つよ类型ほどじょ设计语言ちゅう编写だい码时使用しよう一些以后才指定的类型ざい实例时作为参すうゆびあかり这些类型。かくほどじょ语言かず编译运行环境对泛がたてき支持しじひとし不同ふどうAdaDelphiEiffelJavaC#F#Swift Visual Basic .NET しょう为泛がたgenerics);MLScala Haskell しょうまいり数多すうたparametric polymorphism);C++ Dしょうばん具有ぐゆう广泛かげ响的1994ねんばんてき《Design Patterns》一书称之为参数化类型(parameterized type)。

泛型てき定義ていぎ目的もくてき

[编辑]

泛型てき定義ていぎ主要しゅようゆう以下いかりょうたね

  1. ざいほどじょ编码ちゅういち包含ほうがん类型さんすうてき类型,也就说泛がたてきさんすうただ代表だいひょう类,不能ふのう代表だいひょう個別こべつ对象。(這是當今とうぎん常見つねみてき定義ていぎ
  2. ざいほどじょへん碼中一些包含參數的。其參すう代表だいひょう类或对象とうとう。(現在げんざいじん們大這稱さくばん

ろん使用しよう哪個定義ていぎ,泛型てきまいりすうざい真正しんせい使用しよう泛型必須ひっす作出さくしゅつゆびあかり

いちつよ類型るいけいほどじょげん支持しじ泛型,其主よう目的もくてききょう類型るいけい安全あんぜん及减しょうるい转换てき次数じすうただし一些支持泛型的程序語言只能達到部份目的。

にせだい碼例

[编辑]
るい れい泛類<T> {
  值 : T

  設置せっち值(しん值 : T) {
    值 := しん值
  }

  值() : T {
    かえしかい 值
  }
}

れい方法ほうほう1() {
  れい物件ぶっけん : れい泛類<整數せいすうがた>
  れい物件ぶっけん := しん れい泛類<整數せいすうがた>()
  れい物件ぶっけん.設置せっち值(5)
  輸出ゆしゅつ整數せいすう(れい物件ぶっけん.值())
}

れい方法ほうほう2() {
  れい物件ぶっけん : れい泛類<浮點すうがた>
  れい物件ぶっけん := しん れい泛類<浮點すうがた>()
  れい物件ぶっけん.設置せっち值(5.5)
  輸出ゆしゅつ浮點すう(れい物件ぶっけん.值())
}

ざい這例子中こなかれい泛類いち泛型,而Tいち類型るいけいさんすうざいれい泛類ちゅうぼつゆびあきらTてき實際じっさい類型るいけいただゆうれい方法ほうほう1()れい方法ほうほう2()ざい使用しようれい泛類どきざい以指あかり

運行うんこう這例てきれい方法ほうほう1()はた輸出ゆしゅつ整數せいすう5,而運行うんこうれい方法ほうほう2()はた輸出ゆしゅつ浮點すう5.5。

一些程序语言的泛型特性

[编辑]

.NET てき泛型

[编辑]

.NET 泛型てきさんすうただ代表だいひょう类,不能ふのう代表だいひょう个别对象。よし于 .NET 泛型てき类型さんすう实际类型ざい运行时均かいけしじょ,运行速度そくどかいいん为类がた转换てき次数じすう减少而加かい。另外,使用しようGetType()方法ほうほう于程じょ运行时得泛型及其类型さんすうてき实际类型,さら以运よう反射はんしゃしき编程

using System;

// 定義ていぎ一個泛型列表類,T 表示ひょうじ類型るいけいさんすう
public class GenericList<T>
{
    private T[] _items; // そんもうかれつひょうitemsてきすうくみ
    private int _count; // れつひょうちゅうitemsてき計數けいすう

    // 構造こうぞう函數かんすうはつはじめれつひょうてき容量ようりょう
    public GenericList(int capacity)
    {
        _items = new T[capacity];
        _count = 0;
    }

    // 添加てんかitemいたれつひょうちゅう
    public void Add(T item)
    {
        if (_count < _items.Length)
        {
            _items[_count] = item;
            _count++;
        }
        else
        {
            Console.WriteLine("List capacity reached."); // れつひょう容量ようりょうやめ滿みつる
        }
    }

    // 根據こんきょ索引さくいんれつひょうちゅうてきitem
    public T GetItem(int index)
    {
        if (index >= 0 && index < _count)
        {
            return _items[index];
        }
        else
        {
            throw new IndexOutOfRangeException("Index out of range."); // 索引さくいんちょう範圍はんい
        }
    }
}

public class Program
{
    public static void Main()
    {
        // 創建そうけん一個存儲整數的泛型列表
        GenericList<int> intList = new GenericList<int>(3);
        intList.Add(1);
        intList.Add(2);
        intList.Add(3);
        Console.WriteLine(intList.GetItem(1));  // 輸出ゆしゅつ: 2

        // 創建そうけん一個存儲字符串的泛型列表
        GenericList<string> stringList = new GenericList<string>(2);
        stringList.Add("Hello");
        stringList.Add("World");
        Console.WriteLine(stringList.GetItem(0));  // 輸出ゆしゅつ: Hello
    }
}

ざい上面うわつらてきれい子中こなか展示てんじりょう一個簡單的泛型列表類 GenericList<T>,它可以存もうかにんなん類型るいけいてきすうよりどころゆかり T 指定してい)。Program るいちゅうてき Main 方法ほうほうえんじしめせりょう如何いか使用しよう這個泛型るいらいそんもうか檢索けんさく整數せいすう和字わじくし

.NET 允許いんきょたい個別こべつ泛型てき類型るいけいさんすう進行しんこう約束やくそく包括ほうかつ以下いかいくしゅ形式けいしき[1]假設かせつT泛型てき類型るいけいさんすうCいち般类、泛類,ある泛型てき類型るいけいさんすう):

  • Tいち类。
  • Tいち值類がた
  • T具有ぐゆうさんすうてき公有こうゆうけん構方ほう
  • T实现せっこうI
  • TこれCある繼承けいしょうC

Java てき泛型

[编辑]

Java 泛型てきさんすうただ代表だいひょう类,不能ふのう代表だいひょう个别对象。よし于Java泛型てき类型さんすう实际类型ざい编译时会けしじょ所以ゆえん无法ざい运行时得其类がたさんすうてき类型,而且无法直接ちょくせつ使用しよう基本きほん值类がたさく为泛がた类型さんすう。Java编译ほどじょざい编译泛型时会加入かにゅう类型转换てき编码,运行速度そくどかいいん使用しよう泛型而加かい

よし于运ぎょう时会しょうじょ泛型てき对象实例类型しんいきとう缺陷けっかん经常ひと詬病,Java及JVMてき开发方面ほうめん也尝试解决这个问题,れい如:Javaどおり过在生成せいせい节码时添加てんか类型推导辅助しんいき,从而以通过反射はんしゃせっこう获得部分ぶぶん泛型しんいきどおり过改进泛がたざいJVMてき实现,使つかい支持しじ基本きほん值类がた泛型直接ちょくせつ获得泛型しんいきとう

Java允許いんきょたい個別こべつ泛型てき類型るいけいさんすう進行しんこう約束やくそく包括ほうかつ以下いかりょうたね形式けいしき[2]假設かせつT泛型てき類型るいけいさんすうCいち般类、泛類,ある泛型てき類型るいけいさんすう):

  • T实现せっこうI
  • TこれCある繼承けいしょうC

C++てき泛型(ばん

[编辑]

C++ 泛型てきまいりすう代表だいひょう类或个别对象。ざい一般いっぱん义上,C++ 缺乏けつぼう对泛がたてき类型さんすう进行直接ちょくせつ约束てき手段しゅだんただし利用りよう SFINAE(かたぎいただい换失败非错误,ゆびざいばん实例过程ちゅうてき错误仅意味いみ此次だい换失败,并不一定产生编译错误)规则及 C++11 てき static_assert とう实现相似そうじこうのう

#include <type_traits>

class B{
...
};
class D: public B{
...
};
template<typename T>
void SFINAE(const std::enable_if_t<std::is_base_of<B, T>::value, T> &t);
template<typename T>
void STATIC_ASSERT(const T &t){
    static_assert(std::is_pod<T>::value, "Use with POD types only!");
}

如上じょじょうしょしめせ,std::enable_if(std::enable_if_t<boolean, Type> std::enable_if<boolean, Type>::type てき缩写)利用りよう SFINAE 规则らい实现ばん类型さんすう约束てき手段しゅだんいち。其实现方しき若布わかめ判断はんだん为假,则把类型设为 void,而这はた导致 const void & 这种合法ごうほうてき类型现,从而禁止きんし这种类型さんすうてき使用しよう

static_assert 则在ぬの判断はんだんしつ败时きさきめんてき串作くしつくり为消いき内容ないよう报告为编译错误。

ざい编译时,まい个被使用しようてきふう闭泛がた类型そく所有しょゆう泛型さんすうてき实际类型やめゆびあかりてき泛型)都会とかいゆう独立どくりつてき编码产生,编译ほどじょかいざい此时确保类型安全あんぜんせい如果泛型よう运用其泛がたさんすうてきぼうなり员,而该泛型さんすうまた包含ほうがん该成员的时候,编译ほどじょしょ产生てき错误しんいきあるかいあずか实际问题无关,增加ぞうかじょ错的难度。

かずすえげん

[编辑]
  1. ^ Standard ECMA-335 Common Language Infrastructure (CLI) 4th Edition. June 2006 [2007-08-03]. (原始げんし内容ないようそん于2013-06-26). 
  2. ^ James Gosling, Bill Joy, Guy Steele, Gilad Bracha. The Java Language Specification Third Edition. 2005 [2007-08-03]. (原始げんし内容ないようそん于2009-02-26). 

參考さんこう文獻ぶんけん

[编辑]

延伸えんしん閱讀

[编辑]

外部がいぶ連結れんけつ

[编辑]
C++/D
  • Walter Bright, Templates Revisited页面そん档备份そん互联网档あん).
  • David Vandevoorde, Nicolai M Josuttis, C++ Templates: The Complete Guide, 2003 Addison-Wesley. ISBN 0-201-73484-2
C#/.NET
Delphi/Object Pascal
Eiffel
Haskell
Java