[C#.NET] 善用 泛型方法 提高程式碼效率

  • 8647
  • 0
  • 2013-07-05

[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));
}

image

 


這兩個類別所要做的事情很像,我們可以再優化它們,將 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));
}

image

 


我覺得 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;
    }
}
 image

用戶端的呼叫方式不用改變。


後記:

程式碼無錯並非優,在本篇裡學到了使用泛型方法對程式碼進行重構,提高了程式碼的穩定性以及重用性,未來若有新增的類別,只要繼承 IPrint 介面就可以直接使用PrintName<T>(T Component)方法了。

畫UML圖不是小弟在行的若有謬誤請速告知

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo