c# 面向對象的編程思想


面向對象的三大特征

 

大家都知道,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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM