C#多態性01

來源:互聯網
上載者:User

多態性(Polymorphism)一詞最早用於生物學,指同一種族的生物體具有相同的特性。
在C#中多態性的定義是:同一操作作用於不同的類的執行個體、不同的類將進行不同的解釋、最後產生不同的執行結果。

C#支援兩種類型的多態性:
編譯時間的多態性(靜態聯編)
編譯時間的多態性是通過重載來實現的。方法重載和操作符重載、它們都實現了編譯時間的多態性。
對於非虛的成員來說系統在編譯時間根據傳遞的參數、返回的類型等資訊決定實現何種操作。
運行時的多態性(動態聯編)
運行時的多態性就是指直到系統運行時才根據實際情況決定實現何種操作C#中運行時的多態性。
通過虛成員實現。
編譯時間的多態性為我們提供了運行速度快的特點而運行時的多態性則帶來了高度靈活和抽象的特點。

虛方法
當類中的方法聲明前加上了virtual 修飾符,我們稱之為虛方法,反之為非虛。
使用了virtual 修飾符後不允許再有static, abstract, 或 override 修飾符。
對於非虛的方法,無論被其所在類的執行個體調用還是被這個類的衍生類別的執行個體調
用,方法的執行方式不變。而對於虛方法它的執行方式可以被衍生類別改變,這種改
變是通過方法的重載來實現的。
下面的例子說明了虛方法與非虛方法的區別:
程式清單

using System;
class A
{
public void F() { Console.WriteLine("A.F"); }
public virtual void G() { Console.WriteLine("A.G"); }
}
class B: A
{
new public void F() { Console.WriteLine("B.F"); }
public override void G() { Console.WriteLine("B.G"); }
}
class Test
{
static void Main() {
B b = new B();
A a = b;
a.F();
b.F();
a.G();
b.G();
}
}

例子中A 類提供了兩個方法,非虛的F 和虛方法G 。類B 則提供了一個新的非虛的方法F,
 從而覆蓋了繼承的F 。類B 同時還重載了繼承的方法G。 那麼輸出應該是

A.F
B.F
B.G
B.G

注意到本例中方法a.G() 實際調用了B.G 而不是A.G ,這是因為編譯時間值為A,但運行時值為B。
 所以B 完成了對方法的實際調用。

在衍生類別中對虛方法進行重載
先讓我們回顧一下普通的方法重載。
普通的方法重載指的是類中兩個以上的方法,包括隱藏的繼承而來的方法,取的名字相同,
只要使用的參數類型或者參數個數不同,編譯器便知道在何種情況下應該調用哪個方法。
而對基類虛方法的重載是函數重載的另一種特殊形式。
在衍生類別中重新定義此虛函數時要求的是方法名稱,傳回值類型,參數表中的參數個數,類型,順序都必須
與基類中的虛函數完全一致。在衍生類別中聲明對虛方法的重載要求在聲明中加上override 關鍵字,
而且不能有new, static 或virtual 修飾符。
我們用汽車類的例子來說明多態性的實現
程式清單:

using System;
class Vehicle//定義汽車類
{
public int wheels; //公有成員輪子個數
protected float weight; //保護成員重量
public Vehicle(int w,float g){
wheels = w;
weight = g;
}
public virtual void Speak(){
Console.WriteLine("the w vehicle is speaking!");
}
};
class Car:Vehicle //定義轎車類
{
int passengers; //私人成員乘客數
public Car(int w,float g,int p) : base(w,g)
{
wheels = w;
weight = g;
passengers = p;
}
public override void Speak(){
Console.WriteLine("The car is speaking:Di-di!");
}
}
class Truck:Vehicle //定義卡車類
{
int passengers; //私人成員乘客數
float load; //私人成員載重量
public Truck (int w,float g,int p float l) : base(w,g)
{
wheels = w;
weight = g;
passengers = p;
load = l;
}
public override void Speak(){
Console.WriteLine("The truck is speaking:Ba-ba!");
}
}
class Test
{
public static void Main(){
Vehicle v1 = new Vehicle();
Car c1 = new Car(4,2,5);
Truck t1 = new Truck(6,5,3,10);
v1.Speak();
v1 = c1;
v1.Speak();
c1.Speak();
v1 = t1;
v1.Speak();
t1.Speak();
}
}

分析上面的例子我們看到

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.