[C#.NET] 善用 泛型方法 提高程式碼效率
假設我有Company及Family兩個類別
public class Company
{
public string Name { get; set; }
public string Address { get; set; }
}
public class Family
{
public string Name { get; set; }
public string Address { get; set; }
}
然後還有一個Print.PrintName靜態方法
public static class Print
{
public static string PrintName(Commany Commany)
{
if (Commany==null)
return null;
string data = string.Format("名稱:{0},地址:{1}",Company.Name,Company.Address);
return data;
}
public static string PrintName(Family Family)
{
if (Family == null)
return null;
string data = string.Format("名稱:{0},地址:{1}", Family.Name, Family.Address);
return data;
}
}
在用戶端呼叫
private void button1_Click(object sender, EventArgs e)
{
Company company = new Company() { Name = "點部落", Address = "魔界村" };
Family family = new Family { Name = "余宅", Address = "地球村" };
Console.WriteLine(Print.PrintName(company));
Console.WriteLine(Print.PrintName(family));
}
這兩個類別所要做的事情很像,我們可以再優化它們,將 Print.PrintName 合併改裝一下
public static string PrintName<T>(T Component)
{
if (Component == null)
{
return null;
}
else
{
string data = null;
if (Component is Company)
data = string.Format("名稱:{0},地址:{1}", (Component as Company).Name, (Component as Company).Address);
else if (Component is Family)
data = string.Format("名稱:{0},地址:{1}", (Component as Family).Name, (Component as Family).Address);
return data;
}
}
用戶端的呼叫如下
private void button1_Click(object sender, EventArgs e)
{
Company company = new Company() { Name = "點部落", Address = "魔界村" };
Family family = new Family { Name = "余宅", Address = "地球村" };
Console.WriteLine(Print.PrintName<Company>(company));
Console.WriteLine(Print.PrintName<Family>(family));
}
我覺得 Print.PrintName<T>(T Component) 裡的判斷式很煩,Component 因為看不懂傳入的東西所以還要轉型才能用,程式碼還能再優化一下,我再將相同屬性的東東抽離變成介面。
public interface IPrint
{
string Name { get; set; }
string Address { get; set; }
}
然後 Company 及 Family 繼承 IPrint,並實作Name 及Address 兩個屬性。
public class Company : IPrint
{
public string Name { get; set; }
public string Address { get; set; }
}
public class Family : IPrint
{
public string Name { get; set; }
public string Address { get; set; }
}
再改寫一次Print.PrintName<T>(),使用where ,如此一來Component就看得懂當時傳入的東西是什麼,便可直接使用屬性。
public static string PrintName<T>(T Component) where T : IPrint
{
if (Component == null)
{
return null;
}
else
{
string data = null;
data = string.Format("名稱:{0},地址:{1}", Component.Name, Component.Address);
return data;
}
}

用戶端的呼叫方式不用改變。
後記:
程式碼無錯並非優,在本篇裡學到了使用泛型方法對程式碼進行重構,提高了程式碼的穩定性以及重用性,未來若有新增的類別,只要繼承 IPrint 介面就可以直接使用PrintName<T>(T Component)方法了。
畫UML圖不是小弟在行的若有謬誤請速告知
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET