C# 面向對象的三大特性


一、封裝: 我們可以把世界上任何一個東西都看作為一個對象,那么我們這里以人為例,一個人就肯定是一個對象了。 那么封裝是什么呢? 封裝就是這個人要完成一件事情,他所需要的任何工具都帶在了自己的身上,所需要的技術也都裝在了自己的腦子里了。不需要借助於別人的力量就能完成這一件事情。這個有什么好處呢?好處就是如果我要吩咐這個人去完成一件事情,我不需要知道他是怎么完成的,也不需要協助他去完成,只要知道結果,他完成了就OK了。至於他是先干什么后干什么我不干涉,這有助於他更快更好的干好這件事情,我自己也省事。

1、訪問權限(可見性)

Public:(隨處可見)所有包、類導入后均可見  公共的

Protected:(合法繼承)本身、不同包的子類自身,

Private:(自私自利)只在本類中可見

本類

同包類

public

protected

default

private

不同包類

public

protected

default

 

子類

子類

public

Protected(子類中,且子類自身使用)

 

 

其他類

public

 

 

 

 

2、

(1)、屬性-->private(私有屬性,公開方法,不用默認)

(2)、方法--> public    protected  

書面的解釋如下: 每個對象都包含它能進行操作所需要的所有信息,因此對象不必依賴其它的對象來完成自己的操作。

二、繼承: 還以為人為例,我們每個人都會有一些共同的特征,都要做一些相同的事情。比如:人都有一個腦袋,二只胳膊,二條腳,這是共同的特征。都要吃飯,喝水,這是都要做的相同的事情。那么如果我們現在要聲明很多個人,每個人都會有這些特征,那我不是要寫很多重復的代碼?所以我們可以先建一個人的父類,這個父類不代表一個具體的人,只是一個擁有人所有共同特性的虛擬的人。下次我 們要實例化一個具體的人的時候,只需要將這個人繼承上面這個“虛擬的人”,那么他就擁有了人的所有共同特性。這樣,這些重復的代碼我們就可以不寫了。

當然,繼承的目標不僅僅是為了節省代碼,還有實現后面的多態的功能。初學者只需要了解繼承可以少寫很多代碼就好了,余下的需要在項目中慢慢理解。

書面的解釋如下: 對象的繼承代表一種"is-a"的關系,假如兩個對象A和B,如果可以描述為"B就是A",那么則表示B可以繼承自A。

注意: 如果A繼承了B,那么A不僅擁有了B除私有的特性外的所有特性,A還可以擁有自己獨特的特性。比如上面人的這個例子,一個繼承了 “虛擬的人”,那么他除了有一個腦袋,二只胳膊,二條腳,要吃飯喝水外,他可能還會編程。編程就是他獨特的特性了,因為不是每個人都會編程的。

1、

(1)、延續:父類存在,子類沒有重寫但可以使用;

(2)、新增:父類沒有,子類新增加的

(3)、重寫:父類子類都存在,但是弗雷德不滿足要,子類對其進行從新定義;

2、 實例化:

      (1)、先父類后子類,先靜態后成員;

           實例化的時候先調用父類的靜態構造快,在調用父類的構造方法,然后子類的構造塊,在調用子類的構造方法;

(2)、默認調用父類空構造;

3、重寫  override

      (1)、重寫與重載:

           重寫:繼承的子類中,方法簽名相同( 方法名+形參個數 類型 順序  )

           重載:同一個類 方法名相同 ,形參個數 類型 順序 不同

      (2)、重寫規則:在子類中簽名與父類中相同,在合理范圍內提高子類可見性;

         A、返回類型:基本類型和void必須相同;引用類型要<=父類的返回類

         B、異常:

         C、可見性:要大於或等於父類中被重寫的方法

三、多態: 有多態之前必須要有繼承,只有多個類同時繼承了同一個類,才有多態這樣的說法。

還是以人為例子,前面我們有說過人都要做“吃飯”這樣一個相同的事情。“吃飯”這個事情,體現到類中就是方法了。因為是人都是要做的,所以我們在“虛擬的人”中寫好了這個方法,但每個人都有不同的吃飯方法,有用筷的也有用叉的,有要吃米飯的也有要吃面食的。所以如果我們要描述不同人的吃飯的過程,就要把這個過程放到具體的子類中去了,因為每個人都不一樣嘛。同樣一個方法,子類都有不同的實現方式,這個就是多態了,多態有助於程序的靈活性。

注意:子類中如果重寫了父類的方法(多態),那么父類中的這個方法將不會再調用。

1.好處:

簡化了編程接口。它容許在類和類之間重用一些習慣性的命名,而不用 為每一個新加的函數命名一個新名字。

簡化代碼

如果函數/方法參數中使用的是父類的類型,可以傳入父類、子類的對象

局限性:父類類型的變量,不能直接調用子類特有的方法。必須強轉為子類類型的變量,才能直接調用子類特有的方法

2、編譯時多態:其實就是重載,是對非虛成員來說的,系統在編譯時,根據不同簽名來決定實現何種操作。

3、運行時多態:也就是重寫,是通過虛成員實現的,指直到系統運行時,才根據實際情況決定實現何種操作。

對與第一種情況很容易就能理解,不同簽名就有不同的實現

而第二種情況是在繼承的基礎上實現的,子類繼承基類時,通過對虛成員的重寫,然后利用基類引用子類對象,那么不同的子類對象實現相應的不同操作。

這樣的好處是顯而易見的,利用基類類型定義一次,然后給它傳入不同的子類對象,然后實現不同的操作,提高了效率。

 


免責聲明!

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



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