摘要:[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加上virtual
或 abstract
),另一個方式則是使用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的定義,並不是多型。