week14---6月4日
2015-06-03 20:14
169 查看
一、复习
泛型的概念
泛型的基本格式
二、泛型约束
从上节课Point类引入
类型约束(Constrained types)
在指定一个类型参数时,可以指定类型参数必须满足的约束条件。这是通过在指定类型参数时使用where子句来实现的。
class class-name<type-param> where type-param:constraints{}
其中constraints是一个逗号分割的约束列表。
五种约束类型
(1)可以通过关键字struct指定“值类型约束”(vlaue type constraint)来限制某个类型实参必须是值类型。
(2)可以通过关键字class指定“引用类型约束”(reference type constraint)来限制某个类型实参必须是引用类型。
(3)可以使用“基类约束”(base class constraint)来指定某个基类必须出现在类型实参中。这种约束是通过指定基类名称来实现的。
(4)可以使用“接口约束”(interface constraint)来指定某个类型实参必须实现一个或多个接口。这种约束是通过指定接口名称来实现的。
(5)可以要求类型实参必须提供一个无参数的构造函数,这被称为“构造函数约束”(constructor constraint)。它是通过new()指定的。
1、引用类型和值类型约束
如果引用类型和值类型之间的差别对于泛型代码非常重要,那么这些约束就非常有用。
基本形式:
where T : class
where T : struct
若同时存在其他约束的情况下,class或struct必须位于列表的开头。
2、基类约束
使用基类约束,我们可以指定某个类型实参必须继承的基类。
基类约束有两个功能:
(1)它允许在泛型类中使用由约束指定的基类所定义的成员。例如,可以调用基类的方法或者使用基类的属性。如果没有基类约束,编译器就无法知道某个类型实参拥有哪些成员。通过提供基类约束,编译器将知道所有的类型实参都拥有由指定基类所定义的成员。
(2)确保类型实参支持指定的基类类型参数。这意味着对于任意给定的基类约束,类型实参必须要么是基类本身,要么是派生于该基类的类,如果试图使用没有继承指定基类的类型实参,就会导致编译错误。
基类约束使用下面形式的where子句:
where T:base-class-name
T是类型参数的名称,base-class-name是基类的名称,这里只能指定一个基类。
实例:图像--圆形
4、接口约束
接口约束用于指定某个类型参数必须应用的接口。接口的两个主要功能和基类约束完全一样。
基本形式 where T:interface-name
interface-name是接口的名称,可以通过使用由逗号分割的列表来同时指定多个接口。
如果某个约束同时包含基类和接口,则先指定基类列表,再指定接口列表。
实例:两个变量比较大小。
5、 new()构造函数约束
new()构造函数约束允许开发人员实例化一个泛型类型的对象。
一般情况下,我们无法创建一个泛型类型参数的实例。然而,new()约束改变了这种情况,他要求类型参数必须提供一个无参数的构造函数。
在使用new()约束时,可以通过调用该无参构造函数来创建对象。
基本形式: where T : new()
使用new()约束时应注意两点:
(1)它可以与其他约束一起使用,但是必须位于约束列表的末端。
(2)new()仅允许开发人员使用无参构造函数来构造一个对象,即使同时存在其他的构造函数。换句话说,不允许给类型参数的构造函数传递实参。
泛型的概念
泛型的基本格式
二、泛型约束
从上节课Point类引入
类型约束(Constrained types)
在指定一个类型参数时,可以指定类型参数必须满足的约束条件。这是通过在指定类型参数时使用where子句来实现的。
class class-name<type-param> where type-param:constraints{}
其中constraints是一个逗号分割的约束列表。
五种约束类型
(1)可以通过关键字struct指定“值类型约束”(vlaue type constraint)来限制某个类型实参必须是值类型。
(2)可以通过关键字class指定“引用类型约束”(reference type constraint)来限制某个类型实参必须是引用类型。
(3)可以使用“基类约束”(base class constraint)来指定某个基类必须出现在类型实参中。这种约束是通过指定基类名称来实现的。
(4)可以使用“接口约束”(interface constraint)来指定某个类型实参必须实现一个或多个接口。这种约束是通过指定接口名称来实现的。
(5)可以要求类型实参必须提供一个无参数的构造函数,这被称为“构造函数约束”(constructor constraint)。它是通过new()指定的。
1、引用类型和值类型约束
如果引用类型和值类型之间的差别对于泛型代码非常重要,那么这些约束就非常有用。
基本形式:
where T : class
where T : struct
若同时存在其他约束的情况下,class或struct必须位于列表的开头。
2、基类约束
使用基类约束,我们可以指定某个类型实参必须继承的基类。
基类约束有两个功能:
(1)它允许在泛型类中使用由约束指定的基类所定义的成员。例如,可以调用基类的方法或者使用基类的属性。如果没有基类约束,编译器就无法知道某个类型实参拥有哪些成员。通过提供基类约束,编译器将知道所有的类型实参都拥有由指定基类所定义的成员。
(2)确保类型实参支持指定的基类类型参数。这意味着对于任意给定的基类约束,类型实参必须要么是基类本身,要么是派生于该基类的类,如果试图使用没有继承指定基类的类型实参,就会导致编译错误。
基类约束使用下面形式的where子句:
where T:base-class-name
T是类型参数的名称,base-class-name是基类的名称,这里只能指定一个基类。
实例:图像--圆形
4、接口约束
接口约束用于指定某个类型参数必须应用的接口。接口的两个主要功能和基类约束完全一样。
基本形式 where T:interface-name
interface-name是接口的名称,可以通过使用由逗号分割的列表来同时指定多个接口。
如果某个约束同时包含基类和接口,则先指定基类列表,再指定接口列表。
实例:两个变量比较大小。
5、 new()构造函数约束
new()构造函数约束允许开发人员实例化一个泛型类型的对象。
一般情况下,我们无法创建一个泛型类型参数的实例。然而,new()约束改变了这种情况,他要求类型参数必须提供一个无参数的构造函数。
在使用new()约束时,可以通过调用该无参构造函数来创建对象。
基本形式: where T : new()
使用new()约束时应注意两点:
(1)它可以与其他约束一起使用,但是必须位于约束列表的末端。
(2)new()仅允许开发人员使用无参构造函数来构造一个对象,即使同时存在其他的构造函数。换句话说,不允许给类型参数的构造函数传递实参。
相关文章推荐
- 【Minimum Path Sum】cpp
- Dive into Python(深入Python) 读书笔记
- 计算机组成原理复习提纲
- malloc和定位new表达式
- week14---6月3日
- 简单的梯度下降法求正玄函数局部最小值
- 十六进制转十进制
- C语言中的union用法
- 【BZOJ】【2480】【SPOJ 3105】Mod
- Hello world!
- 烟大课表PC端-不仅仅是浏览器和手机APP
- 华为推出物联网系统LiteOS
- poj3067 Japan
- 【HDU】5253-连接的管道(并查集)
- Android底层开发(二)之HAL层 第二步
- 有三个页面,当点击其中一个另两个隐藏
- osquery An Operating System Instrumentation Framewor
- 烟大课表PC端-不仅仅是浏览器和手机APP
- 网络通信框架Volley的学习(二)
- iOS开发:获取视频特定时段的截图