標籤:
在物件導向的語言中,繼承和多態是十分重要的兩個特徵。目前,C#和Java均為單繼承多介面語言,能夠有效利用物件導向的特徵進行編程。其中繼承是一個將類具體化的過程,繼承深度越高,類就越具體。多態則是用不同的具體化方法實現同一種功能的介面,讓父類具有子類的特徵。同時多態可以實現代碼的複用。
1. virtual方法
virtual方法定義基類中的虛函數,這種函數可以被子類繼承,並在子類中被override成具有子類特性的新函數。比如:
public virtual int sum(){} //……在基類中
public override int sum(){} //……在子類中
注意,C#中的override關鍵字,在子類中覆蓋函數,此時基類改變此函數,子類並不會發生變化,起到了保護的作用。
2. new修飾符
和override比較,new可以顯示地隱藏從基類繼承的成員函數。雖然都是使用子類自己的函數,但是new會隱藏掉、截斷掉基類的函數,而override則會擴充基類函數的功能。下面看一個例子:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace ConsoleApplication1 8 { 9 class Program10 {11 static void Main(string[] args)12 {13 A objA = new D();14 A objB = new B();15 C objC = new D();16 A objD = new A();17 objA.Movie();18 objB.Movie();19 objC.Movie();20 objD.Movie();21 22 }23 class A { 24 public virtual void Movie() {25 Console.WriteLine("MikiMouse");26 }27 }28 class B : A {29 public override void Movie () {30 Console.WriteLine("DisneyMovie");31 }32 }33 34 class C : B {35 public new virtual void Movie () {36 Console.WriteLine("Snow White");37 }38 }39 class D : C {40 public override void Movie () {41 Console.WriteLine("Seven Dwarfs ");42 }43 }44 45 }46 }
其輸出結果是:
簡而言之,new virtual相當於一個斷點,截斷了繼承流。
關於C#中一些關於Inheritance和Polymorphism的事情……