上篇博客写了泛型方法的介绍,本篇主要讲解泛型方法的返回,约束。
先上代码:
这是公共类的代码,我又新建了一个类:
namespace Generic0521.Common
{
public static class GenericBase02
{
public static void ShowTC<T>(T t) where T : class
{
MessageBox.Show(t.ToString());
}
public static void ShowTS<T>(T t) where T : struct
{
MessageBox.Show(t.ToString());
}
public static void ShowTP<T>(T t) where T : People
{
MessageBox.Show(t.ID.ToString() + "------" + t.Name);
}
public static int ShowTPRE<T>(T t) where T : People
{
MessageBox.Show(t.ID.ToString() + "------" + t.Name);
return 10;
}
public static K ShowTPRE<T, K>(T t)
where T : People
where K : People,new ()
{
MessageBox.Show(t.ID.ToString() + "------" + t.Name);
K p = new K();
p.ID = 1111;
p.Name = "qhhh2";
return p;
}
}
这是调用的代码:
private void button2_Click(object sender, EventArgs e)
{
People p1 = new People();
p1.ID = 1;
p1.Name = "qhh";
//GenericBase02.ShowTS<int>(1);
//GenericBase02.ShowTC<string>("qhhh");
//GenericBase02.ShowTC<People>(p1);
//GenericBase02.ShowTPRE<People>(p1);
People pppp = GenericBase02.ShowTPRE<People, People>(p1);
}
先从这个约束说吧,可以看到,咱们这次写的方法,比上一篇最大的不同之处就是参数那个半个括号后面增加了where然后就是巴拉巴拉的,这就是泛型方法的约束。
T:class可不是T继承自class,是指T是引用类型的意思,也就是说,咱们这边传过来的参数是引用类型的,方法定义好之后去调用,不是引用类型的参数编译不过去,这就证明了这点。
除了class引用类型外,还有struct值类型,参数类型比如int 时间等等,咱们实际开发中啊,还是跟数据库和定义的实体关系最大,这就是自定义类型的约束,比如第三个方法,这样不仅可以约束传来的参数是People类型的,还可以在这个方法内部使用传来的自定义类型的方法和属性,而且根据里氏代换的原则,我们不仅可以传递People类型,也可以传递他的子类。
说完了这个基本的约束,咱们来看看返回类型吧。
1、返回已定的基本类型,就比如第四个方法 public static int ShowTPRE<T>(T t) where T : People,传入自定义类型的参数,返回int 就直接写就行,跟平常方法一样,没什么说的。
2、返回自定义的类型参数。
返回自定义类型的参数,那就是咱们做的实体啦什么的了,但是咱们传进来的实体是A,根据各种具体业务计算后咱们要返回B,那就是方法五这样写了。
public static K ShowTPRE<T, K>(T t)
where T : People
where K : People,new ()
{
MessageBox.Show(t.ID.ToString() + "------" + t.Name);
K p = new K();
p.ID = 1111;
p.Name = "qhhh2";
return p;
}
首先,尖括号里有两个字母了,因为什么呢?因为你不管返回什么参数出去,你得定义他的类型吧,咱们上篇也说了,这个尖括号中的字母什么的就是占位符,你调用时候传的类型的占位符。后边的where是咱们上面的讲的约束,怎么多加了一个new()?这个new是约定这个K是可以实例化 有无参构造函数的约束。
咱们这里的例子传来的返回的都是People类型的,可能看不出来什么作用,甚至把自己绕晕了,建议在测试学习时候返回类型换个其他的自己定义的实体类型。
在方法五中,方法体中咱们new了一个K类型的实例,为什么能new,就是上边new()约束的作用啦,不然你K new不出来,new个People返回不出去,因为方法不接收 0.0, 而且,这个p变量就代表了People,使用属性,方法等。
暂时到这里了,看着代码相对容易理解,我写的文字就做一下代码的解释,相当于注释啦。