具體內容可以參見《C#與.Net技術平台演練》一書中的11-7章節 版本控制。
下面是案例代碼:
using System;
class A
{
public void F1()
{
Console.WriteLine("A.F1");
}
public virtual void F2()
{
Console.WriteLine("A.F2");
}
public virtual void F3()
{
Console.WriteLine("A.F3");
}
}
class B:A
{
public virtual void F1()
{
Console.WriteLine("B.F1");
}
public override void F2()
{
Console.WriteLine("B.F2");
}
public new void F3()
{
Console.WriteLine("B.F3");
}
}
class C:B
{
public override void F1()
{
Console.WriteLine("C.F1");
}
public override void F2()
{
Console.WriteLine("C.F2");
}
public void F3()
{
Console.WriteLine("C.F3");
}
}
class App
{
static void Main(string[] args)
{
A o1=new A();
Console.WriteLine("/////////////////////");
Console.WriteLine("A o1=new A()");
Console.WriteLine("after we call the methods:");
o1.F1();
o1.F2();
o1.F3();
////////////////////////////////////////////////////
B o2=new C();
Console.WriteLine("/////////////////////");
Console.WriteLine("B o2=new C()");
Console.WriteLine("after we call the methods:");
o2.F1();
o2.F2();
o2.F3();
////////////////////////////////////////////////////
A o3=o2;
Console.WriteLine("/////////////////////");
Console.WriteLine("B o3=new C()");
Console.WriteLine("after we call the methods:");
o3.F1();
o3.F2();
o3.F3();
Console.Read();
}
}
思考後可以對比答案:
/////////////////////
A o1=new A()
after we call the methods:
A.F1
A.F2
A.F3
/////////////////////
B o2=new C()
after we call the methods:
C.F1
C.F2
B.F3
/////////////////////
B o3=new C()
after we call the methods:
A.F1
C.F2
A.F3
小結:針對物件導向的多態特性,我們常常將對象聲明為一個基礎類型,但是初始化為衍生類別型,以此在調用基礎類的方法時,實現方法的動態邦定。要實現這個特性,一定要記住一個原則:基礎類中的方法應該使用virtual修飾符,而衍生類別中的同一方法使用override修飾符,只有完整的配對使用才可以實現多態的這一個特性。