泛型 generic

类型参数化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
通常在js中,我们会存在某种计算,例如 
function add(x,y) {return x + y};
but 我也也会有这种抽象
function add3
function add5
function add7
所以我们会做一个面向横切面的抽象 eg
function addWrap(y) {
return function(x) {

}
}
function add3 = addWrap(3);
function add5 = addWrap(5);
function add7 = addWrap(7);
So,真实只是申明了一个Function,其他都是调用addWrap
换用到C#逻辑也是通用。C# 类型中也需要这样程度的抽象,这个在C#里被称为 泛型。

泛型类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class MyIntArray{
int ArrayPointer = 0;
int [] SmartArray;

public void Push(int x){};
public void Pop(){};
}
class MyFloatArray{
int ArrayPointer = 0;
int [] SmartArray;

public void Push(int x){};
public void Pop(){};
}
可想而知,针对不同的类型都会增加一个声明类,这样太冗余。
So 泛型做了啥
...
...

class MyArray <T> {
// ^___ T 泛型参数
int ArrayPointer = 0;
T [] SmartArray;

public void Push(T x){};
public void Pop(){};
}

MyArray <int>
// ^____ 类型实参

声明泛型类

在类名后放置一组尖括号

在尖括号中用逗号分隔需要的类型。这个称为类型参数(type parameter)。

在代码的主体里使用类型参数去代替类型。

类型实参:对于传入的真实类型参数,叫做类型实参。

最后返回的结果叫做 构造类型

1
2
3
4
5
一个常见的使用类型举例

MyArray<int> myIntArr = new MyArray<int>();
MyArray<float> myFloatArr = new MyArray<float>();

约束

泛型的类型参数的约束。

对于参数类型的约束,可以使用户的更好的使用类型。

where - 通过where 关键字进行约束。

泛型方法/函数

类型参数的位置:类型参数在函数名之后,函数/方法的参数列表之前。

1
2
3
4
5
public void PrintData<S,T> (S s, T t) where S:Person {
//^____类型参数
}

PrintData<int, int>(3,3);

泛型接口

1
2
3
4
5
interface IArray<T> {
T[] currentArray {
get;
}
}

逆变

协变