[C#]繼承簡介

  • 1049
  • 0
  • 2016-03-05

摘要:[C#]繼承簡介

最近複習了一下物件導向的基本概念及語法,就簡單地做一些筆記。這裡的程式碼都是以.NET Fiddle這個線上工具進行編輯及編譯。

簡單的繼承關係

新增一個類別Parent如下:


public class Parent
{
    public string Name { get; set; }   

    public void Print()
    {
        Console.WriteLine("Parent Name: " + this.Name );
    }     
}

建立一個使用Parent類別的Client端 程式碼如下,這裡的Code建立Parent物件,並呼叫print()


public class Program
{
    public static void Main()
    {
        Parent pObj = new Parent();
        pObj.Name = "PaPa";
        pObj.Print();
    }
}

可以得到結果如下:

Parent Name: PaPa

建立一個繼承Parent的類別Child如下:


public class Child : Parent
{
}

Client端 以下列的Code進行測試


public static void Main()
{
    Child cObj = new Child();
    cObj.Name = "ccc";
    cObj.Print();
}

可以得到結果如下:

Parent Name: ccc

雖然Child 類別沒有定義任何的method,但卻可以叫用Print()這個method。這是因為Child 類別繼承了Parent 類別,所以擁有Parent類別的成員。

建立與父類別同名的method

上一個Example中,Child物件雖然可以叫用父類別-Parent 類別的method-Print()。正因為是使用父類別的method,所以顯示出的訊息是父類別定義的訊息。如果Child物件想要使用自己類別定義的Print(),則需要自行宣告Print()的實作方式。


public class Child : Parent
{
    public void Print()
    {
        Console.WriteLine("Parent Name: " + this.Name );
    }     
}

雖然這段程式碼可以正常運作,不過,編譯器卻會出現警告訊息。

使用override or new 關鍵字

這時試著使用override關鍵字加在method之前,以覆蓋父類別的Print()定義


public class Child : Parent
{
    override public void Print()
    {
        Console.WriteLine("Parent Name: " + this.Name );
    }     
}

但是加上了override關鍵字,編譯器反而發出錯誤訊息:

 

這是因為在C#中,如果沒有父類別的允許的話,是不能Override父類別的method。一個方式是改寫父類別(在該method加上virtualabstract),另一個方式則是使用new關鍵字在子類別的method上。


public class Child : Parent
{
    new public void Print()
    {
        Console.WriteLine("Child Name: " + this.Name );
    }     
}

Client端 再執行一次底下的程式碼以建立Child物件,並呼叫Print()


public static void Main()
{
    Child cObj = new Child();
    cObj.Name = "ccc";
    cObj.Print();
}

就可以看到Print()出來的訊息是Child類別所定義的訊息了。

Child Name: ccc

new 關鍵字

那麼,在子類別的method上使用關鍵字new是代表什麼含意呢?就我自己的理解(若有錯還請指教),是用來宣告子類別已經知道父類別有同名 的method,而且需要重新定義自己的實作方式。

會有這個機制存在,是因為在使用繼承機制時,很多時候,繼承的是別人寫的Library。所以,如果恰巧寫了一個與父類別同名的method,編譯器就會好心的提示你一個警告訊息。

如果不理會這個警告訊息,程式還是可以正常運作。如果我們很確定我們不想用父類別的實作方式,只想用自己重新定義的實作方式。那麼,就把new關鍵字加在method開頭。那麼編譯器就知道你已經了解同名method的來龍去脈,就不會再提醒你了。

不過要瞭解到,這只是覆蓋父類別同method的定義,並不是多型


參考