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