Generic

更新时间:2023-07-25 21:55

泛型(Generics)是Visual Basic 2005中的一种新特性,然而很多开发者在第一次看到它的时候可能忽略它,但是他们最终会发现,在了解泛型之后,离开了泛型就几乎不能工作了。

C++泛型

泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。

在C++编程语言中,泛型程序设计主要是由函数模板(function template)与类型模板(class template)来支持的,这种观念是取材自Simula的泛型程序设计。它采用typename和class两个关键字,来标识模板类型的类型参数。C++之父Bjarne Stroustrup认为可以通过C++的重载(overloading)功能来表达泛型。

C++中的STL(Standard Template Library)中的vector,list就属于泛型类

java泛型

介绍

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。

Java语言引入泛型的好处是安全简单。

在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。

泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。

规则和限制

1、泛型的类型参数只能是类类型(包括自定义类),基础类型会被自动打包为对应的包装类型。

2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。

3、泛型的类型参数可以有多个。

4、泛型的参数类型可以使用extends语句,例如。习惯上称为“有界类型”。

5、泛型的参数类型还可以是通配符类型。例如Class classType = Class.forName(java.lang.String);

泛型还有接口、方法等等,内容很多,需要花费一番功夫才能理解掌握并熟练应用。

类属编程

(generic programming)

generic是构成库的另一种方式, 这与传统的oop是不同的.这类程序库一般由类属组件和类属算法组成,组件和算法通过迭代器组装起来,组件则对迭代器提供一定的封装.这种程序库的优点在于能够提供比传统程序库更灵活的组装方式,而不损失效率.

STL,boost,ACE,ATL等库都是建构在generic的概念之上.STL对迭代器进行了分类,分类是从支持的功能上的,不同的类属算法对迭代器有不同的要求.下面对迭代器的种类做一下归纳。

1. Input Iterator(输入迭代器) : 单向读取和遍历.

2. Output Iterator(输出迭代器):单向写入和遍历.

3. Forward Iterator(前向迭代器):单向,读,写,支持多路遍历

4. Bidirectional Iterator(双向迭代器): 双向,读,写,支持多路遍历

5. RandomAccessIterator(随机访问迭代器):随机访问,读,写,支持多路遍历

强化(Refinement) 五种迭代器有一种归属关系.1<-2<-3<-4<-5

list容器提供了BidirectionalIterator,因此可以用于find算法(该算法需要InputIterator)

但sort算法(需要RandomAccessIterator),因此下面的代码不能通过编译.

list lst;

//... code insert value in lst

sort (lst.begin(), lst.end() ) ; // error!!!

我们知道deque提供了RandomAccessIterator,因此他却可以使用sort算法,而且能高效运行.

VB.NET

泛型这个专业术语并没有道出这种特性能够实现的真实功能。假设我们需要编写一个执行数学计算的类(class)。使用标准的代码编写技术,你必须为整型和实数型(对于所有的形式)编写独立的方法。通过使用泛型,你可以一次性编写方法,并让.NET框架组件为你处理数据类型的问题。泛型可以使你在编程过程中体会到更多的快乐。你不需要额外的工作就能体会到代码重用(reuse)的优点。

一、泛型的优点

使用泛型可以提高性能,其中显著的一个改进是.NET框架组件不会在值类型上使用装箱(boxing);使用泛型类的另一个令人惊讶的特性是IntelliSense居然可以跟踪强数据类型定义。

二、建立泛型类

使用泛型的时候,你应该选择建立有广泛用途的类,这样的话所建立的泛型类所花费的时间最终会整个开发时间上获得回报。例如,集合就是一种处理多个数据类型的类,而一般你会在多个应用程序中使用同一个集合的多种不同的形式,如果采用泛型,那么就不需要多次重复的建立不同形式的同一集合。

三、使用泛型类

我们在上面建立的泛型类在使用方法上与其他类没有什么不同,仍然需要将其实例化。

四、约束泛型类

也许你对实例中泛型类能够接受任何数据类型感恐惧,你不得不担心在使用中出现程序仍然会对错误参数产生反映,对,是存在这样的风险,不过我们可以对泛型类加以约束。

五、为泛型类定义多个类型

你不必仅仅使用一种数据类型定义每个类,泛型类也提供多个数据类型,你所需要做的是用逗号分开每种数据类型。

结束语

尽管泛型类起先看起来仅仅是前进的一步,但是它们实际上是.NET革命中的一个巨大飞跃。使用泛型把你从为每个数据类型建立新类中释放了出来,提高了性能,并减少了开发和调试的时间。为了体会Visual Studio 2005中最好的部分,你真的应该试着使用这个新特性——你会发现自己将很喜欢它的。

泛型有哪些重要优点?

你可能想知道泛型除了减少输入之外还提供哪些功能,毕竟你仍然需要建立类来处理信息。它的最好的特性在于正确地构建的泛型类可以真正减少代码中的安全性问题。由于你使用几个数据类型定义类,你不必依赖于通用Object类型。泛型类依赖于强数据类型定义,这与其它类在处理特定数据类型的时候是相同的。简短的说,尽管你获得了很大的灵活性,但是作为结果的代码却更加优良。

使用泛型类还可以提高性能。其中最大的一个改进是.NET框架组件不会在值类型上使用包装(boxing)。尽管泛型类可以使用多个数据类型工作,但是它在后台单独地处理每一种数据类型。这种技术确保了在你的工作量最小的情况下,应用程序提供最佳的性能。

使用泛型类的另一个令人惊讶的特性是IntelliSense居然可以为你跟踪强数据类型定义。与使用对象建立处理多个数据类型的通用方法不同,你的代码依赖于强数据类型定义,这意味着IntelliSense为你提供了更多的信息。这种特性不但使我们更容易处理代码,还减少了错误和调试时间。

免责声明
隐私政策
用户协议
目录 22
0{{catalogNumber[index]}}. {{item.title}}
{{item.title}}