C#物件導向三大特性

來源:互聯網
上載者:User

標籤:

C#物件導向三大特性

物件導向的三個基本特徵是:封裝、繼承、多態。

 

封裝:
隱藏內部功能的具體實現,只保留和外部交流資料的借口。就好比電視機,用一個外殼把內部零組件及控制電路封裝起來,只提供按鈕或者遙控器介面供人使用。
封裝可以隱藏實現細節,使得代碼模組化。
封裝成類或結構:
類和結構實際上是建立對象的模板,每個對象都包含資料,並提供了處理和訪問資料的方法。
(1)類定義了每個類對象(執行個體)可以包含什麼資料和功能。舉例來說,如果一個類表示客戶,我們就可以定義欄位customerId,name和address,以包含該客戶的資訊,還可以定義處理儲存在這些欄位中的資料的功能。接著,如我們常寫的那樣,new一下執行個體化對象,以表示某個客戶,並為這個執行個體設定這些欄位,使用其功能。
結構在記憶體中的儲存方式(類是儲存在堆(heap)上的參考型別,而結構是儲存在堆棧(stack)上的實值型別)、訪問方式和一些特徵(如結構不支援繼承)與類不同。較小的資料類型使用結構可以提高效能。但在文法上,結構和類非常相似,主要的區別是使用關鍵字struct代替class來聲明結構,在c#中,可以把結構看做是縮小的類。

(2)類成員
類中的資料和函數稱為類的成員。類成員可以分為資料成員和函數成員。
資料成員包含了類的資料——欄位、常量和事件。
函數成員提供了操作類中資料的某些功能,包括方法,建構函式,屬性和終結器(finalizer)、運算子和索引器。

(3)特殊的類
在封裝類的時候,我們可能會按照實際的需要構造一些“特殊”的類(比如靜態類,抽象類別等),下面簡要介紹說明一下常見的特殊的類。
<1>、靜態類
如果類只包含靜態方法和屬性,該類就可以是靜態。靜態類在功能上與使用私人靜態建構函式建立的類相同。不能建立靜態類的案例。使用static關鍵字,編譯器可以檢查以後是否給該類添加了執行個體成員,如果是,就會產生一個編譯錯誤。


<2>、密封類
c#允許把類和方法聲明為sealed。對於類來說,這就表示不能繼承該類;對於方法來說,這表示不能重寫該方法。但是在方法上使用sealed是沒有意義的,除非該方法本身是某個基類上另一個方法的重寫形式。如果定義一個新方法,但不想讓別人重寫它,首先就不要把它聲明為virtual。但如果要重寫某個基類方法,sealed關鍵字就提供了一種方式,可以確保為方法提供的重寫代碼是最終的代碼,其他人不能再重寫它。


<3>、抽象類別
c#允許把類和方法聲明為abstract,抽象類別不能被執行個體化,而抽象函數沒有執行代碼,必須在非抽象的衍生類別中重寫。


<4>、部分類
partial關鍵字允許把類,結構或介面放在多個檔案中。一般情況下,一個類儲存在單個檔案中。但有時,多個開發人員需要訪問一個類,或者某種類型的代碼產生器產生了一個類的某部分,所以把類放在多個檔案中是有益的。

<5>、Object類
眾所周知,.net類都派生自System.Object。這個類的方法是所有.net類都實現的方法。

方法                                                                    存取修飾詞                      作用
string ToString()                                                  public virtual                  返回對象的字串表示
int GetHashCode()                                                public virtual                  在實現字典(散列表)時使用
bool Equals(object obj)                                         public virtual                  對對象的執行個體進行相等比較
bool Equals(object obja,object objb)                      public static                   對對象的執行個體進行相等比較
bool ReferenceEquals(object obja,object objb)        public static                    比較兩個引用是否指向同一個對象
Type GetType()                                                    public                            返回物件類型的詳細資料
object MemberwiseClone()                                     protected(不能重寫)         進行對象的淺層複製 (Shallow Copy)
void Finalize()                                                       protected virtual             解構函式的.net版本

 

 (2)結構(struct)
在許多方面,可以把c#中的結構看做是縮小的類。它基本上與類相同,但更適合於把一些資料群組合起來的場合。下面介紹它與類的區別:


<1>、結構是實值型別
結構是實值型別,它儲存在堆棧中或儲存為內聯(inline)(如果它是另一個對象的一部分,就會儲存在堆中),其生存期的限制與簡單的資料類型一樣。
注意:因為結構是實值型別,所以new運算子和類及其他參考型別的工作方式不同。new一個結構並不分配堆中的記憶體,而是調用相應的建構函式,根據傳遞給它的參數,初始化所有的欄位。

<2>、結構不能被繼承
結構不是為繼承設計的。不能從一個結構中繼承,唯一的例外是結構派生於類System.Object.因此結構也可以訪問System.Object的方法。結構的繼承鏈是這樣的:每個結構派生於System.ValueType,System.ValueType派生於System.Object。System.ValueType並沒有給System.Object添加任何新成員,但提供了一些更適合結構的執行代碼。
注意:結構可以實現介面。也就是說結構並不支援實現繼承,但支援介面繼承。
a、結構總是派生於System.ValueType,它們還可以派生於任意多個介面。
b、類可以派生於使用者選擇的另一個類,它們還可以派生於任意多個介面。

<3>、結構的建構函式(結構不能包含顯式的無參建構函式)
為結構定義建構函式的方式與為類定義建構函式的方式相同,但不允許定義無參數的建構函式,其原因影藏在.net運行庫的執行方式中。即:.net運行庫不能調用使用者提供的定製無參數建構函式,因此ms禁止在c#中的結構內使用無參數的建構函式。

 



繼承:
繼承最大的好處是實現代碼的高效重用,也更加形象的描述現實世界中對象的關係。

繼承的使用:
程式中使用物件導向的繼承特性時,主要分為單繼承和多繼承兩種情況,下面分別進行介紹

1.單繼承

單繼承一般用於類之間的繼承,C#中的類只支援單繼承,實現單繼承時,使用“子類:基類”格式。

2.多繼承

如果要使用多繼承,需要使用介面,因為C#中的類只支援單繼承,而介面支援多繼承,實現多繼承時,繼承的多個介面中間用逗號(,)隔開。

繼承的原則:

1.除了object類,每個類有且只有一個直接基類,如果沒有顯示指定類的直接基類,那麼它的直接基類就隱含的設定為object。object類沒有任何直接或間接基類,

它是所以有的終極基類。

2.無論基類成員的可訪問性如何,除建構函式和解構函式外,所有其他基類的成員都能被子類繼承,然而,有些繼承成員在子類中可能是不可訪問的,比如,基類的private成員在子類中不可訪問,但是,如果將子類的對象作為參數傳入基類的方法內,那麼在基類的代碼內部,就可以通過子類或者子類的對象來訪問基類的private成員。

3.子類可以擴充它的直接基類。

4.繼承是可以傳遞的,比如C類從B類繼承,而B類從A類繼承,那麼C類就會既繼承B類中的成員,又繼承A類中的成員。

5.類不能迴圈繼承,比如A類繼承於B類,而B類繼承於C類,那麼C類就不能再去繼承A類,因為它們之間存在了一種迴圈關係。

6.類的直接基類必須至少與類本身具有同樣的可訪問性,比如,如果從private類派生一個public類,將會導致編譯時間錯誤。

7.在子類中可以聲明具有相同名稱或簽名的新成員來隱藏從基類繼承而來的成員,但是,隱藏繼承而來的成員時並不移除該成員,而只是使被隱藏的成員在子類中不可以直接存取。

8.類中可以聲明虛方法等,而子類可以重寫這些虛方法的實現

9.C#中只支援類的單一繼承,但是支援介面的多重繼承。

10.類的執行個體包含在該類中及它的所有基類中聲明的所有執行個體欄位的集合,並且存在一個從子類到它的任何基類的隱式轉換,因此,可以將子類的執行個體看成是其任何基類的執行個體的引用。

 

擴充【介面的實現】:

介面的實現通過類繼承來實現,一個類雖然只能繼承一個基類,但可以繼承任意多個介面。聲明實現介面的類時,需要在基類列表中包含類所實現的介面的名稱。

C#中實現繼承的文法格式如下:

class DerivedClass: BaseClass { }

說明:

繼承類時,必須在子類和基類之間用冒號(:),另外,如果繼承多個介面,那麼在繼承的每個介面之間用逗號分割(,)。

 

擴充【顯式介面成員實現】

如果類實現兩個介面,並且這兩個介面包含具有相同簽名的成員,那麼在類中實現該成員時,將導致兩個介面都使用該成員作為它們的實現,然而,如果兩個介面成員實現不同的功能,那麼這可能會導致其中一個介面的實現不正確或兩個介面的實現都不正確,這時可以顯式地實現介面成員,即建立一個僅通過該介面調用並且特定於該介面的類成員。顯式介面成員實現是使用介面名稱和一個句點命名該類成員來實現的。

 

擴充【介面特徵】

1.介面類似於抽象基類:繼承介面的任何非抽象類別型都必須實現介面的所有成員;

2.不能直接執行個體化介面;

3.介面可以包含事件、索引器、方法和屬性;

4.介面不包含方法的實現;

5.類和結構可從多個介面繼承;

6.介面自身可從多個介面繼承。

說明:

介面使得服務的協議與實現相分離,它是組件編程的基礎,在組件編程中,介面是組件向外公布其功能的唯一方法。

 

擴充【聲明介面】

C#中使用interface關鍵字聲明介面,其文法格式如下:

修飾符 interface 介面名稱 :繼承的介面列表

{

    介面內容;

}

說明:

(1)聲明介面時,通常以大寫字母“I”開頭;

(2)聲明介面時,除interface關鍵字和介面名稱外,其它的都是可選項;

(3)可以使用new 、public、protected、internal和private等修飾符聲明介面,但介面成員必須是公用的。

 


多態:
即同一個動作作用不同的對象產生不同的具體行為。比如,駕駛是一個動作,但是把駕駛作用在汽車和飛機上時,產生了不同的具體的駕駛操作與過程。它的好處是規範和簡化介面的設計。比如,你所見到的電器的開關標記符號基本都是一樣的,這樣可以方便使用者識別和理解。簡單來說就是(使用基類或介面變數編程)

在多態編程中,基類一般都是抽象類別,其中擁有一個或多個抽象方法,各個子類可以根據需要重寫這些方法。或者使用介面,每個介面都規定了一個或多個抽象方法,實現介面的類根據需要實現這些方法。

因此,多態的實現分為兩大基本類別:繼承多態和介面多態。

繼承多態

設想動物園飼養員每天需要給他所負責死樣的獅子、猴子和鴿子餵食。

首先,建立三個類分別代表三個動物

飼養員用Feeder類表示。由於三種動物吃的動物一樣,Feeder類必須擁有三個喂動物的公用方法:

過程如下:

如果領導有又把熊貓交給他管理,這是我們的程式不得不給Feeder類在增加一個方法:FeedPanda();

萬一小李後來又不管猴子了,又要從Feeder類中刪除FeedPigeon()方法。

所以這種編程方式很明顯不合理的。

我們可以應用多態的方法解決。

首先因為它們都是動物,因此,可以建立一個Animal抽象基類。

由於不同的動物吃不同的食物,所以在Animal類中定義一個抽象方法:eat();有子類負責實現。

現在,可以將Feeder類的三個餵養方法合并為一個FeedAnimal:

Feeder類代碼:

餵養過程:

我們修改一下Feeder類的定義,增加一個新方法FeedAnimals(),新方法遠端功能是餵養一群動物,接受的是Animal的數組:

過程如下:

代碼中數組ans的元素為Animal,因此,可以在其中存入任何一個Animal的子類。具有這種特性的數組成為"多態數組"。

編程中應用多態,可以將其簡化為一下兩句:

應用繼承實現對象的統一管理。

應用介面定義對象的行為特徵。

使用多態的好處:

當要修改程式並擴充系統時,需要修改的地方較少,對其他部分代碼的影響較小。

 

 

 

 

 

 

 

 

 

C#物件導向三大特性

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.