标签:nim 构造函数 constrain 构造 派生类 interface turn return 实现
1.声明泛型类
声明泛型类和普通类差不多
public class mytest<T1,T2>{
public T1 somevar=new T1();
public T2 othervar=new T2();
}
构造类型则在构造函数中
mytest<int,long>{}
变量声明:
mytest<int,long> t=new mytest<int,long>();
var t=new mytest<int,long>();
2.用where语句进行约束
关键字 约束列表
where TypeParam : constraint , constraint
类型参数
共有五种类型参数:
约束类型 描述
类名 只有这个类型的类,或者继承这个类型
class 任何引用类型,包括类、数组、委托和接口都可以用作类型实例
struct 任何值类型都可以用作类型实参
接口名 只有这个接口或实现这个接口
new() 任何带有无参公共构造函数的类型。这叫做构造类型约束
3.泛型方法
与其他泛型不一样方法是成员,可以在泛型与非泛型中实现
public void PrintfData<S,T>(S p,T t)where S:person{}
调用泛型方法:
Mymethod<short,int>();
推断类型,如果只有一个参数则
public vod test<T>(T t1);
int t=5;
test(t);
4.泛型接口
interface IMyFc<T>{
T ReturnIt(T value);}
class test<S>:IMyfc<S>{
public S ReturnIt(S invalue){
return invalue;}
5.可变性
协变:( 需要添加关键字 out )能让基类泛型引用连接到派生类泛型引用,如果在有派生类关键字只需要加在派生类,逆变一样。
class Animal{
public int legs=4;}
class Dog:Animal{}
delegate T Factory<T>(); <—factory委托
class Program{
static Dog MakeDog(){
return new Dog();} <—符合Factory委托
static void main(){
Factory<Dog>dog=d;
Factory<Animal>ani=dog;//报错
}
兼容性原则在这个例子不适用,俩个委托同级。我们需要一个Animal对象,返回一个dog的引用也可以变成Animal,但委托需要的是Animal,所以委托不匹配。如果派生类只用于输出值,这种结构化的委托有效性的常数之间关系叫做协变。
在delegate T Factory<out T>();添加out参数
逆变:(需要添加关键字 in)能够让派生类泛型连接基类泛型引用
class Animal{
public int legs=4;}
class Dog:Animal{}
delegate void Action<in T>(); <-in 逆变关键字
class Program{
static void Anto(Animal a){
Console.WriteLine(“{0}”,a.Legs);}
static void main(){
Action<Animal>act1=Anto;
Action<DOg> dog1=act1;
dog1(new dog());
}
协变:因为像期望那样,调用获得了一个指向基类的引用。
逆变:因为像期望那样,被调用的方法收到了一个基类的引用。
标签:nim 构造函数 constrain 构造 派生类 interface turn return 实现
原文地址:https://www.cnblogs.com/dlvguo/p/9688412.html