2014年4月29日 星期二

C# 多型 (Polymorphism) - virtual function

2011-01-30 (日): C# 多型 (Polymorphism) 的簡單範例

物件導向的最基本概念就是封裝、繼承及多型,封裝及繼承的概念並不是很難理解,但多型可能就比較困難一點。之前在看一本 C# 的書時,發覺作者對於多型的概念解釋的並不對,剛好最近在開發的程式,有非常多使用到此機制的地方,在這裡介紹一下。
有一個基礎類別叫做 BassClass,在其中宣告一個 Virtual Function。
public class BassClass
{
    virtual public Boolean DoSomeThing()
    {
        return false;
    }
}
假設有 A 到 Z 總共 26 個不同類型的工作,則由 BassClass 衍生出 26 個子類別,分別為 ClassA, ClassB ~ ClassZ,利用 override 關鍵字,來修改父類別的 Virtual Function:
public class ClassA : BassClass
{
    public override Boolean DoSomeThing()
    {
        //在 ClassA 裡實作此函數
    }
}

public class ClassB : BassClass
{
    public override Boolean DoSomeThing()
    {
        //在 ClassB 裡實作此函數
    }
}
...
public class ClassZ : BassClass
{
    public override Boolean DoSomeThing()
    {
        //在 ClassZ 裡實作此函數
    }
}
要運用這些子類別時,可以將它們儲存在陣列或是 HashTable 裡面,或是任何其他可以放 Object 指標的地方,依自己的用途來決定。多型的好處是在使用這些子類別時,不需要知道原本真正的型別為何 (ClassA~ClassZ),使用 BassClass 來當變數就可以直接呼叫 DoSomeThing() 這個函數。
使用陣列的範例如下:
BassClass[] JobList = new BassClass[26];

JobList[0] = new ClassA();
JobList[1] = new ClassB();
...
JobList[25] = new ClassZ();
//執行工作任務 A 的時候
int index = 0;
JobList[index].DoSomeThing();
使用 HashTable 的範例如下:
Hashtable JobTable = new Hashtable();

JobTabl.Add("A", new ClassA());
JobTabl.Add("B", new ClassB());
...
JobTabl.Add("Z", new ClassZ());
//執行工作任務 A 的時候
BaseClass job = (BaseClass)JobTabl["A"];
job.DoSomeThing();
這樣的寫法好處如下:
1.  程式碼可以寫的比較簡潔,例如用一個迴圈來處理陣列等等方式,避免寫一大堆的 if 或 switch 等判斷式
2.  不同的工作交給不同的類別來處理,以後需要加新工作時,就增加一個新類別,這樣的寫法比較有彈性
3. 當工作類型愈來愈多時,此方法的效益就會很明顯
4. 不管工作是很簡單或很複雜,都可以封裝在某個類別內,不會影響到其他類別的工作,保持獨立性

沒有留言:

張貼留言