面向對象的三大特征
大家都知道,c#是由Java修改演變出來的語言,那么c#與Java在很多方面其實是類似的,面向對象的三大特征:封裝,繼承,多態。
相信大家對前兩者,比較熟悉了,封裝聽起來很抽象但其實用的地方很多,基本在編程過程都會用到,繼承相對來說就比較好理解了,可以簡單理解為:兒子繼承父親的財產,擁有父親所有的屬性和方法,實際繼承是多態的一個前提;所以在這里就不過多描述了,重點對多態進行一個梳理和總結,本人今天學習得到的體會,如有理解不恰當之處,盡請諒解!
多態:在基類的函數前加上virtual關鍵字,用一件話來概括,在派生類中重寫該函數,運行時將會根據對象的實際類型來調用相應的函數。如果對象類型是派生類,就調用派生類的函數;如果對象類型是基類,就調用基類的函數。其中,多態分為靜態多態和動態分類。

①函數重載就是一個靜態多態,比較簡單就不再加以說明
以下面一個代碼為例:
public int sum(int a,int b){
return a+b;
}
int main(){
sum(10,20);
return 0;
}
②動態多態: 顯然這和靜態多態是一組反義詞,它是在程序運行時根據基類的引用(指針)指向的對象來確定自己具體該調用哪一個類的虛函數。
有多態之前必須要有繼承,只有多個類同時繼承了同一個類,才有多態這樣的說法。
在繼承關系的前提下,實例化出不同的對象,這些對象調用相同的方法,但是卻表現出不同的行為,這就叫做多態。
在 C#語言中體現多態有三種方式:虛方法,抽象類, 接口。
1、虛方法
1.1什么是虛方法?
在父類中使用 virtual 關鍵字修飾的方法, 就是虛方法。在子類中可以使用 override 關鍵字對該虛方法進行重寫。
Virtual方法也可以單獨執行。
1.2虛方法語法
父類:
public virtual 返回值類型 方法名()
{
方法體代碼;
}
子類:
public override 返回值類型 方法名()
{
方法體代碼;
}
2、抽象類
虛方法還是有方法體的,當我們父類中的這個方法已經虛到完全無法確定方法體的時候,就可以使用另外一種形式來表現,這種形式叫抽象方法。
2.1 抽象方法語法
抽象方法的返回值類型前用關鍵字abstract修飾,且無方法體。
public abstract void Hello();
抽象方法必須存在於抽象類中。
abstract class FuLei
3、接口
3.1 接口語法
3.1.1 抽象類到接口
namespace xxx
{
interface IFly
//實際的使用情況是,interface前面也有可能加public,里面的方法倒是不用加public。比如用接口的實例裝載子類型對象
{
//接口中不能包含字段.
//private string name;
//接口中的方法不能有方法體,不能有訪問修飾符(默認是public)
void Fly();
}
}
當抽象類中所有的方法都是抽象方法的時候,這個時候可以把這個抽象類用另外
一種形式來表現,這種形式叫接口。
虛方法,抽象類,接口是三種實現多態的手段。
3.1.2 語法格式要求:
接口使用 interface 關鍵字定義,沒有 class 關鍵字,接口名一般使用 “IXxxx”
(實際使用要在interface前加public ,因為我有時候為了依賴注入,直接使用接口來裝載子類對象)
使用自動屬性 public int Age {get;set;})
<1>接口中所有的方法都是抽象方法,所以接口不能被實例化;
<2>一個類可以實現多個接口,被實現的多個接口之間用逗號分隔開;
class Batmobile:Car,IFly
<3>一個接口可以繼承多個接口, 接口之間也要用逗號分隔。
類與類之間只能單繼承。
3.1.3 總結
在繼承關系的前提下, 實例化出不同的對象, 這些對象調用相同的方法, 但是卻
表現出不同的行為, 這就叫做多態。
三者語法比較:

三者使用場景對比:
虛方法:父類中的個別方法用虛方法實現,然后允許子類在有需要的情況下重寫這些虛方法。
virtual和override
父類中包含虛方法也可以實例化對象。
抽象類:父類定義一系列的規范,子類去把父類里面定義的這些規范全部實現。
Abstract和override
父類是抽象類,那么不能單獨實例化。
接口:是一種功能的擴展,是在原有的類的繼承關系以外的新功能的擴展。
Interface Ixxxx
void B1();
class Zi:Fu,IBBB
{
public void B1()
{
Console.WriteLine("B1");
}
}
部分內容以及圖片復制於:https://www.cnblogs.com/qixinbo/p/8244583.html
