using System;
class A
{
public void show()
{
Console.WriteLine("A.show");
}
public virtual void play() //定義為“virtual”,表明可以過載,不能過載非虛函數
{
Console.WriteLine("A.play");
}
}
class B : A
{
public void show() //覆蓋(隱藏)A中的show方法,不加“show”,會編譯警告
{
Console.WriteLine("B.show");
}
public override void play() //過載A中的play方法,如果不加“override”,警告。
{
Console.WriteLine("B.play");
}
}
class C : A
{
new public void show() //隱藏A中的show方法,加“show”,不會編譯警告
{
Console.WriteLine("C.show");
}
new public void play() //隱藏A中的play方法,但是不構成過載,相當於另一個方法
{
Console.WriteLine("C.play");
}
}
class D
{
public static void Main(string[] args)
{
A a = new A();
B b = new B();
C c = new C();
a.show();
a.play();
b.show();
b.play();
c.show();
c.play();
a = b;
a.show();
a.play();
a = c;
a.show();
a.play();
}
}
輸出結果為:
A.show
A.play
B.show
B.play
C.show
C.play
A.show
B.play
A.show
A.play
注:在翻譯中,作者對“override”,“new”,“overload”的翻譯比較混亂,比如都有“覆蓋”,“隱藏”,“重載”,“過載”等,但是個人認為:
override----過載
new---------覆蓋、隱藏
overload---重載
比較貼切,當然,如何翻譯並不重要,關鍵是區別他們之間的區別。
override 的方法必須是:被聲明為virtual的方法,其中可以過載,也可以不過載;被聲明為abstract的方法,必須被override方法過載。過載之後可以實現多態性-動態聯編。
new:聲明的方法用於隱藏基類中聲明的同名函數,它與基類中的同名函數沒有任何關系,僅僅同名而已。與多態無關。
overload:重載,就是定義不同簽名的同名方法,也是多態性的一種表現。