泛型对于我们写程序可以有奇效 在合理的运用下 会使代码更简洁明了
例如List 就是一个很好的例子
所以我今天更新一篇关于泛型的博文
方法的使用
首先介绍一下函数方法的使用
public T GetAndAddComponent<T>(GameObject obj) where T:Component
{
if (!obj.GetComponent<T>())//检查该游戏物体是否还有T组件
{
obj.AddComponent<T>();//没有添加
}
return obj.GetComponent<T>();//本身就有或者是添加之后的返回
}
public List<Component> GetAndAddComponens<T, K>(GameObject obj) where T : Component where K : Component
{
if (obj.GetComponent<T>() == null)//检查该游戏物体是否还有T组件
{
com.Add(obj.AddComponent<T>());//添加并且添加到list
}
if (obj.GetComponent<K>() == null)//检查该游戏物体是否还有T组件
{
com.Add(obj.AddComponent<K>());// 添加并且添加List中
}
return com;//返回list
}
这两个方法是自动 检测传入的游戏物体是否带有我们想要的组件
如果有 直接返回组件 如果没有 添加之后再返回
public interface IRole
{
int level { get; set; }
}
public class MyPlayer : IRole
{
public int level { get; set; }
}
public class MyNPC : IRole
{
public int level { get; set; }
}
public class MyMonster : IRole
{
public int level { get; set; }
}
public bool CompareLevel<T, K>(T t1, K t2) where T : IRole where K : IRole
{
//因为泛型t1,t2都被约束需要实现接口,所以我们可以强制转换到IRole来获取level比较
return ((IRole)t1).level >= ((IRole)t2).level;
}
//那么怎么使用呢?
//接下来看:
public void Test()
{
//先定义三个测试用的类型
MyNPC npc = new MyNPC();
MyPlayer player = new MyPlayer();
MyMonster monster = new MyMonster();
//对各个类型的level赋值
npc.level = 1;
player.level = 2;
monster.level = 3;
//比较npc和player的level就很简单了,只需要这样调用即可
bool b1 = CompareLevel<MyNPC, MyPlayer>(npc, player); //npc?payer//false
bool b2 = CompareLevel<MyNPC, MyMonster>(npc, monster);//npc?monster//false
bool b3 = CompareLevel<MyPlayer, MyMonster>(player, monster);//payer?monster//false
}
然后是我们可以比较几个不同或者相同的类的变量
泛型类的使用
首先给大家看一种 特别方便的使用方法
public class fanxing : MonoBehaviour
{
// Use this for initialization
void Start()
{
Water<string> test1 = new Water<string>();
test1.info = "KuangQuanShui";//在此传入水的名字是"矿泉水"(可以将"T"看作是string类型)
Water<int> test2 = new Water<int>();
test2.info = 100;//在此传入水的温度是 100(可以将"T"看作是int类型)
Debug.Log("水的名字: " + test1.info + " 水的温度: " + test2.info);
}
}
public class Water<T>
{
public T info;//水的信息(属性)
}
如果对List十分熟悉 看这个也不会陌生
public class fanxing2 : MonoBehaviour
{
// Use this for initialization
void Start()
{
//从A产线出来的生产日期是string类型的"20130610",水是矿泉水,温度是20,
Water<string, WaterBase> test1 = new Water<string, WaterBase>();//Water<任意类型,直接收WaterBase类型> 在此"T"相当于string类型
test1.data = "20130610";
test1.info.name = "KuangQuanShui";
test1.info.temperature = 20;
//从B产线出来的生产日期是int类型的20130610,水是纯净水,温度是20,
Water<int, WaterBase> test2 = new Water<int, WaterBase>();//Water<任意类型,直接收WaterBase类型> 在此"T"相当于int类型
test2.data = 20130610;
test2.info.name = "ChunJingShui";
test2.info.temperature = 20;
}
}
public class Water<T, U> where U : WaterBase //限定"U"只能接收WaterBase类型
{
public T data;//出厂日期(可接受int型的20130610,或者string类型的"20130610");
public U info;//水的具体信息(矿泉水/纯净水...温度)
}
public class WaterBase
{
public string name;
public int temperature;
}
接下来就是泛型类的继承
public class fanxing : MonoBehaviour
{
// Use this for initialization
void Start()
{
TestChild1 test = new TestChild1();
test.data = "KuangQuanShui";
Testchild2 test2 = new Testchild2();
test2.data = 100;
Son1 son1 = new Son1();
son1.data1 = "KuangQuanShui";
son1.data2 = 10;
}
}
#region 一个占位符
public class Test<T>
{
public T data;
}
public class TestChild1 : Test<string> { }
public class Testchild2 : Test<int> { }
#endregion
#region 两个占位符
public class Fater<T, U>
{
public T data1;
public U data2;
}
public class Son1 : Fater<string, int> { }
#endregion
这里基本包括了所有泛型类型的使用方法
如果有什么问题 大家可以联系我
主页有联系方式(知无不答)