泛型编程
此條 |
|
---|
|
|
泛型
泛型的 定義 及目的
[编辑]泛型
在 程 序 编码中 一 些包含 类型参 数 的 类型,也就是 说泛型 的 参 数 只 可 以代表 类,不能 代表 個別 对象。(這是當今 常見 的 定義 )在 程 序 編 碼中一些包含參數的类。其參數 可 以代表 类或对象等 等 。(現在 人 們大多 把 這稱作 模 板 )
偽 代 碼例子
[编辑]類 例 泛類<T> {
值 : T
設置 值(新 值 : T) {
值 := 新 值
}
獲 取 值() : T {
返 回 值
}
}
例 方法 1() {
例 物件 : 例 泛類<整數 型 >
例 物件 := 新 例 泛類<整數 型 >()
例 物件 .設置 值(5)
輸出 整數 (例 物件 .獲 取 值())
}
例 方法 2() {
例 物件 : 例 泛類<浮點數 型 >
例 物件 := 新 例 泛類<浮點數 型 >()
例 物件 .設置 值(5.5)
輸出 浮點數 (例 物件 .獲 取 值())
}
T
T
一些程序语言的泛型特性
[编辑].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 T
C
T
是 一 個 类。T
是 一 個 值類型 。T
具有 無 參 數 的 公有 建 構方法 。T
实现接 口 I
。T
是 C
,或 繼承 自 C
。
Java 的 泛型
[编辑]Java 泛型
JavaT
C
T
实现接 口 I
。T
是 C
,或 繼承 自 C
。
C++的 泛型(模 板 )
[编辑]C++ 泛型
#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!");
}
static_assert 则在
数 据 源
[编辑]- ^ Standard ECMA-335 Common Language Infrastructure (CLI) 4th Edition. June 2006 [2007-08-03]. (
原始 内容 存 档于2013-06-26). - ^ James Gosling, Bill Joy, Guy Steele, Gilad Bracha. The Java Language Specification Third Edition. 2005 [2007-08-03]. (
原始 内容 存 档于2009-02-26).
參考 文獻
[编辑]- Musser, D. R.; Stepanov, A. A. Generic programming. P. Gianni (编). Symbolic and Algebraic Computation: International symposium ISSAC 1988. Lecture Notes in Computer Science 358. 1989: 13–25. ISBN 978-3-540-51084-0. doi:10.1007/3-540-51084-2_2.
- Stroustrup, Bjarne. Evolving a language in and for the real world: C++ 1991-2006 (PDF). ACM HOPL 2007. 2007 [2018-04-04]. (
原始 内容 存 档 (PDF)于2007-11-20). - Gamma, Erich; Helm, Richard; Johnson, Ralph; Vlissides, John. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley. 1994. ISBN 0-201-63361-2.
延伸 閱讀
[编辑]- Gabriel Dos Reis and Jaakko Järvi, What is Generic Programming?, LCSD 2005.
- Gibbons, Jeremy. Backhouse, R.; Gibbons, J.; Hinze, R.; Jeuring, J. , 编. Datatype-generic programming. Spring School on Datatype-Generic Programming 2006. Lecture Notes in Computer Science 4719. Heidelberg: Springer: 1–71. 2007. CiteSeerX 10.1.1.159.1228 .
- Bertrand Meyer. "Genericity vs Inheritance (页面
存 档备份,存 于互联网档案 馆)." In OOPSLA (First ACM Conference on Object-Oriented Programming Systems, Languages and Applications), Portland (Oregon), 29 September–2 October 1986, pages 391–405.
外部 連結
[编辑]- generic-programming.org (页面
存 档备份,存 于互联网档案 馆) - Alexander A. Stepanov, Collected Papers of Alexander A. Stepanov (页面
存 档备份,存 于互联网档案 馆) (creator of the STL)
- 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
- Jason Clark, "Introducing Generics in the Microsoft CLR (页面
存 档备份,存 于互联网档案 馆)," September 2003, MSDN Magazine, Microsoft. - Jason Clark, "More on Generics in the Microsoft CLR (页面
存 档备份,存 于互联网档案 馆)," October 2003, MSDN Magazine, Microsoft. - M. Aamir Maniar, Generics.Net (页面
存 档备份,存 于互联网档案 馆). An open source generics library for C#.
- Delphi/Object Pascal
- Nick Hodges, "Delphi 2009 Reviewers Guide (页面
存 档备份,存 于互联网档案 馆)," October 2008, Embarcadero Developer Network, Embarcadero. - Craig Stuntz, "Delphi 2009 Generics and Type Constraints," October 2008
- Dr. Bob, "Delphi 2009 Generics (页面
存 档备份,存 于互联网档案 馆)" - Free Pascal: Free Pascal Reference guide Chapter 8: Generics (页面
存 档备份,存 于互联网档案 馆), Michaël Van Canneyt, 2007 - Delphi for Win32: Generics with Delphi 2009 Win32 (页面
存 档备份,存 于互联网档案 馆), Sébastien DOERAENE, 2008 - Delphi for .NET: Delphi Generics (页面
存 档备份,存 于互联网档案 馆), Felix COLIBRI, 2008
- Eiffel
- Haskell
- Johan Jeuring, Sean Leather, José Pedro Magalhães, and Alexey Rodriguez Yakushev. Libraries for Generic Programming in Haskell[
失效 連結 ]. Utrecht University. - Dæv Clarke, Johan Jeuring and Andres Löh, The Generic Haskell user's guide (页面
存 档备份,存 于互联网档案 馆) - Ralf Hinze, "Generics for the Masses (页面
存 档备份,存 于互联网档案 馆)," In Proceedings of the ACM SIGPLAN International Conference on Functional Programming (ICFP), 2004. - Simon Peyton Jones, editor, The Haskell 98 Language Report (页面
存 档备份,存 于互联网档案 馆), Revised 2002. - Ralf Lämmel and Simon Peyton Jones, "Scrap Your Boilerplate: A Practical Design Pattern for Generic Programming," In Proceedings of the ACM SIGPLAN International Workshop on Types in Language Design and Implementation (TLDI'03), 2003. (Also see the website devoted to this research)
- Andres Löh, Exploring Generic Haskell, Ph.D. thesis, 2004 Utrecht University. ISBN 90-393-3765-9
- Generic Haskell: a language for generic programming (页面
存 档备份,存 于互联网档案 馆)
- Java
- Gilad Bracha, Generics in the Java Programming Language (页面
存 档备份,存 于互联网档案 馆), 2004. - Maurice Naftalin and Philip Wadler, Java Generics and Collections, 2006, O'Reilly Media, Inc. ISBN 0-596-52775-6
- Peter Sestoft, Java Precisely, Second Edition, 2005 MIT Press. ISBN 0-262-69325-9
- Java SE 7, 2004 Sun Microsystems, Inc.
- Angelika Langer, Java Generics FAQs (页面
存 档备份,存 于互联网档案 馆)