樣本:有父類 classA 與它的子類 classB。為描述關鍵實質的撰寫方便,在類中沒有包含任何內容。為了證明 classA 與 classB 之間的繼承關係,程式如下:
using System;class classA{}class classB : classA{}class Demo{ static void Main(string[] args) { classA a = new classB(); Console.WriteLine(a.GetType().ToString()); }}
運行結果顯示為:classB。為什嗎?原因請閱讀《大話設計模式》中有關物件導向的內容。本人在此不閑述了。
下面將樣本中的 classA 加個沒有內容的方法,在子類 classB 中去重寫這個方法。
using System;class classA{ public virtual void method() { }}class classB : classA{ public override void method() { Console.WriteLine("classB!"); }}class Demo{ static void Main(string[] args) { classB b = new classB(); b.method(); }}
上面範例程式碼的運行結果可以看到 classB 類中的方法重寫。因為classA中的方法為空白,所以下面我們將classA的方法改為抽象方法,接著對它的對象執行個體進行向上轉型,讓classA可以調用這個方法,就像是自己實現了這個方法一樣。
using System;abstract class classA{ public abstract void method();}class classB : classA{ public override void method() { Console.WriteLine("調用 classB 中的方法!"); }}class Demo{ static void Main(string[] args) { classB b = new classB(); classA a = (classA)b; a.method(); }}
這裡的 classA 中的抽象方法我們可以看成是行為的一種契約,如果我們在 classA 中不必實現該方法的話,就可以將它改為介面:
using System;interface classA{ void method();}class classB : classA{ public void method() { Console.WriteLine("classB!"); }}class Program{ static void Main(string[] args) { classB b = new classB(); classA a = (classA)b; a.method(); }}
這是本人在Java語言編程實現的程式的基礎上用C#重寫的。以上是C#物件導向的多態和向上轉型的內容。容我再多說一句:其實程式設計語言只是編寫代碼的工具,而編程思想都是相通的。