關(guān)于泛型,在本站中已經(jīng)有幾篇文章作了相關(guān)介紹,本文從代碼重用提高效率的角度再次探討了泛型的使用心得。具體思路是通過(guò)泛型將兩個(gè)相似的方法合并到一起,具體實(shí)現(xiàn)原理與過(guò)程如下:
有兩個(gè)類:
public class Dog
{
public string Name { get; set; }
}
public class Cat
{
public string Name { get; set; }
}
現(xiàn)在有一個(gè)需求,要求將Dog和Cat的名字打印出來(lái),寫兩個(gè)方法,分別用于打印Dog和Cat的名字:
//打印Dog的名字
public static void PrintDogName(Dog dog)
{
Console.WriteLine(dog.Name);
}
//答應(yīng)Cat的名字
public static void PrintCatName(Cat cat)
{
Console.WriteLine(cat.Name);
}
需要完成打印名字的工作時(shí),實(shí)例化Dog和Cat,再分別調(diào)用兩個(gè)方法來(lái)打印名字:
static void Main(string[] args)
{
//實(shí)例化Dog
Dog Spot = new Dog() { Name = "WangWang" };
//實(shí)例化Cat
Cat Persian = new Cat() { Name = "Mimi" };
//打印Dog實(shí)例的Name
PrintDogName(Spot);
//打印Cat實(shí)例的Name
PrintCatName(Persian);
}
在做codereview的時(shí)候,發(fā)現(xiàn)這兩個(gè)方法是如此的相似,只有處理的類型不一樣。在這個(gè)示例中可以這樣合并:
//本示例的合并方法
public static void PrintName(string name)
{
Console.WriteLine(name);
}
下面用泛型方法來(lái)將這兩個(gè)方法合并成一個(gè)方法,來(lái)提高代碼復(fù)用:
public static void PrintName<T>(T t)
{
//打印的是Dog
if (t is Dog)
{
Console.WriteLine((t as Dog).Name);
return;
}
//打印的是Cat
if (t is Cat)
{
Console.WriteLine((t as Cat).Name);
return;
}
//打印的既不是Dog也不是Cat
Console.WriteLine("This method only support Dog and Cat.");
}
這種方法是把方法合并成一個(gè)了,但總的代碼量沒(méi)有減少。只是把原來(lái)兩個(gè)方法里的代碼拿到一個(gè)方法里來(lái)了,后來(lái)又想了一種合并的方法,步驟如下:
首先將Dog類和Cat類抽象出一個(gè)接口來(lái):
//包含名字屬性的接口
interface IName
{
string Name { get; set; }
}
Dog和Cat類都要繼承這個(gè)接口:
//Dog類繼承了IName接口
public class Dog : IName
{
public string Name { get; set; }
}
//Cat類繼承了IName接口
public class Cat:IName
{
public string Name { get; set; }
}
現(xiàn)在重寫這個(gè)泛型方法:
//限制泛型必須實(shí)現(xiàn)IName接口
public static void PrintName<T>(T t)where T:IName
{
Console.WriteLine(t.Name);
}
這樣方法體內(nèi)的代碼就不用重復(fù)了,而且將來(lái)要打印任何繼承IName接口的名字了,代碼可擴(kuò)展。
新聞熱點(diǎn)
疑難解答
圖片精選