繼承、封裝、多型是物件導向的三大特性。這裡主要理解一下繼承和多型。繼承可以理解為子類繼承父類。
其中有幾個詞在繼承和多型中經常用到:new、virtual、override、sealed、abstract
結合例子看一下這幾個詞的用法和說明:
1、new:我認為就是一個標記。目的就是為了避免衝突。父類中的方法和子類中的方法一模一樣,子類的方法前加:new,來避免衝突。
程式碼:
public class Parent { public Parent() { Console.WriteLine("父類構造"); } public void GaGa() { Console.WriteLine("父類的【GaGa】叫方法"); } public virtual void Walk() { Console.WriteLine("父類走的動作"); } } public class Children : Parent { public Children() { Console.WriteLine("子類的構造"); } new public void GaGa() { Console.WriteLine("子類方法GaGa與父類未公開繼承的GaGa方法重疊,子類用new將父類方法隱藏。"); } public override void Walk() { Console.WriteLine("子類走的動作"); } }
父類Parent中:
public void GaGa()
{
Console.WriteLine("父類的【GaGa】叫方法");
}
子類中同樣有這樣的方法:加入new方法
new public void GaGa()
{
Console.WriteLine("子類方法GaGa與父類未公開繼承的GaGa方法重疊,子類用new將父類方法隱藏。");
}
那我們呼叫時這樣寫:
class Program { static void Main(string[] args) { Parent p = new Children(); //父類GaGa()方法 p.GaGa(); Console.WriteLine("---------------------------------------"); } }
因為有new的區分父類和子類的方法(完全相同的方法),所以呼叫的是父類的GaGa方法。
執行結果截圖:
分析執行結果:子類繼承父類,例項化子類時,先構造父類構造,再構造子類構造,之後我們呼叫了子類中與父類相同方法的GaGa(),但是我們用new在子類方法前加以區分。
二、virtual 虛方法,也是一個標記,標記這個類中的方法可以在子類中重寫覆蓋(override)或者隱藏(new)
1、override
public class Parent { public Parent() { Console.WriteLine("父類構造"); } public void GaGa() { Console.WriteLine("父類的【GaGa】叫方法"); } public virtual void Walk() { Console.WriteLine("父類走的動作"); } } public class Children : Parent { public Children() { Console.WriteLine("子類的構造"); } new public void GaGa() { Console.WriteLine("子類方法GaGa與父類未公開繼承的GaGa方法重疊,子類用new將父類方法隱藏。"); } public override void Walk() { Console.WriteLine("子類走的動作,完全覆蓋父類公開可以繼承的此方法"); } }
這裡除了注意父類和子類的walk()方法的寫法,還需注意:
Parent p = new Children(); //父類GaGa()方法 p.GaGa(); ----------這個是子類用new方法加以區別父類的方法 p.Walk(); ----------這個是子類用 override 重寫覆蓋父類方法
注意執行結果:
我們例項化的是子類,但是賦給了父類引用,而子類中正好Walk()方法覆蓋了父類方法。這樣呼叫的時候就是子類的Walk()
方法的實現。
(2)new
public class Parent { public Parent() { Console.WriteLine("父類構造"); } public void GaGa() { Console.WriteLine("父類的【GaGa】叫方法"); } public virtual void Walk() { Console.WriteLine("父類走的動作"); } } public class Children : Parent { public Children() { Console.WriteLine("子類的構造"); } new public void GaGa() { Console.WriteLine("子類方法GaGa與父類未公開繼承的GaGa方法重疊,子類用new將父類方法隱藏。"); } new public void Walk()-------------------------看這!!!!!!!!! { Console.WriteLine("子類走的動作,完全覆蓋父類公開可以繼承的此方法"); } }
區別於上面,父類Walk()標記為virtual 可以重寫,現在的子類是用new也是區別於相同方法
呼叫結果:
對的,子類沒有用override覆蓋父類方法,所以呼叫的還是父類的那個自己的Walk()方法。
三、override:上面已經提到是在父類中用到virtual,子類就用override進行重寫。
四、sealed密封的,密封類是不可以繼承的。
五、abstract:抽象,抽象類中的抽象方法,繼承了此類的子類必須重寫抽象實現
總結:
關鍵字 | 可以擁有此關鍵字的物件 | 作用 | ||
new | 子類與父類擁有相同方法的子類方法 | 隱藏父類相同方法,這樣子類和父類的方法相互獨立,不會存在衝突 | ||
virtual | 父類的方法 | 父類的此方法可以讓父類進行重寫,子類可以根據實際情況決定是否重寫。 | ||
override | 子類對應重寫父類的方法,用此標記。 | 用於子類對父類標記virtual的方法的重寫標記,這樣就實實在在的覆蓋了父類的那個可以允許子類重寫的方法。記住是覆蓋。 | ||
abstract | 用於類和方法 | 類--不可以例項化,方法--如果繼承此類,就必須實現abstract方法。 | ||
sealed | 類 | 表示,該類不可以繼承 |