十三、泛型
admin
2024-03-20 01:07:45

文章目录

  • 1、泛型
  • 2、泛型约束
    • 2.1、值类型
    • 2.2、引用类型
    • 2.3、存在无参公共构造函数的非抽象类型
    • 2.4、某个类本身或其派生类
    • 2.5、某个接口的派生类
    • 2.6、另一个泛型类型本身或其派生类型
  • 3、约束组合使用
  • 4、多个泛型约束

1、泛型

  • class 类名
  • interface 接口名
  • 函数名(...)
  • 泛型可以有多个,用 , 分开
// 泛型类
class MyTest
{public T Value;// 这个不是泛型方法哦(只有函数名后面有<>的才是)public void Test(T t){// ...}
}// 普通类
class MyTest
{// 泛型方法public void Test(T t){Console.WriteLine(t);}// 泛型方法public void Test(){T t = default(T);// ...}
}// 泛型接口
interface ICommon
{T Value{set;get;}
}// 普通类继承泛型接口要指定泛型具体类型
class MyCommonImpl : ICommon
{// ...
}// 泛型类与泛型接口所用泛型相同则可不指定接口泛型具体类型
class MyCommonImpl02 : ICommon
{// ...
}

2、泛型约束

  • 关键字:where
  • 一共 6 种约束
    • 值类型:where 泛型字母:struct
    • 引用类型:where 泛型字母:class
    • 存在无参公共构造函数的非抽象类型:where 泛型字母:new()
    • 某个类本身或其派生类:where 泛型字母:类名
    • 某个接口的派生类:where 泛型字母:接口名
    • 另一个泛型类型本身或其派生类型:where 泛型字母:另一个泛型类型字母

2.1、值类型

class Test where T:struct
{public T Value;public void TestFun(K k) where K:struct{Console.WriteLine(k);}
}// 某方法内↓↓↓
Test test = new Test();
test.Value = 10;
test.TestFun(test.Value); // 10

2.2、引用类型

class Test where T:class
{public T Value;public void TestFun(K k) where K:class{Console.WriteLine(k);}
}// 某方法内↓↓↓
Test test = new Test();
test.Value = "嘎嘎";
test.TestFun(test.Value); // "嘎嘎"

2.3、存在无参公共构造函数的非抽象类型

class Test where T:new()
{public T Value;public void TestFun(K k) where K:new(){Console.WriteLine(k);}
}class MyCons
{public override string ToString(){return "这是一个有无参构造的类的ToString()";}
}// 某方法内↓↓↓
Test test = new Test();
test.Value = new MyCons();
test.TestFun(test.Value); // "这是一个有无参构造的类的ToString()"

2.4、某个类本身或其派生类

class Test where T:MyCons
{public T Value;public void TestFun(K k) where K:MyCons{Console.WriteLine(k);}
}class MyCons
{public override string ToString(){return "这是MyCons的ToString()";}
}// 某方法内↓↓↓
Test test = new Test();
test.Value = new MyCons();
test.TestFun(test.Value); // "这是MyCons的ToString()"

2.5、某个接口的派生类

class Test where T : ITest
{public T Value;public void TestFun(K k) where K : ITest{Console.WriteLine(k);}
}interface ITest
{ }class MyTest : ITest
{public override string ToString(){return "这是 ITest 实现类 MyTest 的ToString()";}
}// 某方法内↓↓↓
Test test = new Test();
test.Value = new MyTest();
test.TestFun(test.Value); // "这是 ITest 实现类 MyTest 的ToString()"

2.6、另一个泛型类型本身或其派生类型

class Test where T : U
{public T ValueT;public U ValueU;public void TestFun(K k, V v) where K : V{Console.WriteLine("{0}{1}", k, v);}
}interface ITest
{ }class MyTest : ITest
{public override string ToString(){return "这是 ITest 实现类 MyTest 的ToString()";}
}class YourTest : ITest
{public override string ToString(){return "这是 ITest 实现类 YourTest 的ToString()";}
}// 某方法内↓↓↓
Test test = new Test();
test.ValueT = new MyTest();
test.ValueU = new YourTest();
test.TestFun(test.ValueT, test.ValueU);
// 这是 ITest 实现类 MyTest 的ToString()这是 ITest 实现类 YourTest 的ToString()

3、约束组合使用

  • 不冲突的情况下随意组合
class Test where T:class, new()
{}

4、多个泛型约束

  • 罗列 where 就完了(别随手加逗号啥的,空开即可)
class Test where T:class, new() where V:struct
{}

相关内容

热门资讯

山水皆有情!丽江两山一江的千年... 去过丽江、走过虎跳峡的人,大概率都听过哈巴雪山和金沙江的传说。很多人站在峡谷之下,望着奔腾不息的金沙...
活力中国调研行丨“殷”你而来 ... 9月12日,游客在殷墟博物馆“甲骨文展厅”内参观。位于河南省安阳市的殷墟博物馆新馆是首个全景式展现商...
浦江之夜赴美好相逢,第37届上... 9月12日晚,黄浦江畔灯火璀璨,第37届上海旅游节大巡游在外滩中山东一路上演。不少观众早早便来到外滩...
美丽中国丨秋韵紫鹊界 梯田入画... 这是9月11日拍摄的紫鹊界梯田(无人机照片)。 金秋九月,湖南省娄底市新化县紫鹊界梯田稻谷渐次成熟。...
中国之巅奏响《共同的节日》,千... 千吨阻尼器,“迎世赛、游上海旅游节”。9月13日,由上海市文化和旅游局指导推出上海旅游·会客│巅峰之...