第十七章 泛型
-
什么是泛型
泛型是为了适应多种不同种类的数据类型而存在的。有了它之后,我们可以不用为不同的数据类型而单独写一个适配。这样很麻烦。
类型不是对象,而是对象的模板。泛型类型也不是类型,而是类型的模板。
-
写法
C++中,写法比c#中多了一点东西。
Template <typename T>
申明完之后,然后才用T。
C#中,直接用
Class MyStack<T>
?
步骤: 声明泛型类型、通过提供真实类型构建构造类型、从构造类型创建实例。
<>类型参数。 也叫占位符。 和值参数、引用参数、输出参数等类似。
?
C++中,有模板类,类模板,模板函数,函数模板。其中,模板函数就是函数模板的实例化。
C#中,有泛型类、构造类。其实后者是前者的实例化。
?
非泛型栈与泛型栈之间的比较:
-
类型参数的约束
为了让编译器知道参数可以接受哪些类型,需要增加额外的信息。
需要用where字句。
?
Class myclass <T1,T2,T3>
Where T2: Customer
Where T3: IComparable
{
}
?
约束类型和次序。
Class struct interface new();
?
-
泛型方法
Public void myfun<T,S> (T p, S t) where S:person
{
//内容
}
?
调用:myfun<short,int>();
推断类型,如果编译器已经知道方法调用中具体的参数类型。我们可以省略<> 不写。
?
-
扩展方法和泛型类
- 泛型结构
struct Piece<T>
{
public Piece(T data) { _data = data; }
public T _data;
}
- 泛型委托
delegate R mydelegate<T,R>(T value);
这里面包含两个参数列表。委托形参列表T value; 类型参数列表 R <T,R>。 返回值、形参列表、约束字句。
-
泛型接口
Interface Imyifc<T> { T ReturnIt(T invalue); }
注:泛型接口的实现必须唯一。保证类型实参组合不会在类型中产生两个重复的接口。也就是说,不能有同样的接口声明。
-
斜变与逆变
略。