深刻淺出OOP(一): 多態和繼承(早期綁定/編譯時多態)

在本系列中,咱們以CodeProject上比較火的OOP系列博客爲主,進行OOP深刻淺出展示。程序員

不管做爲軟件設計的高手、或者菜鳥,對於架構設計而言,均須要屢次重構、取捨,以有利於整個軟件項目的健康構建,有些經驗是前輩總結的,咱們拿來使用便可,有些是團隊知識沉澱的,總之複用前人好的思想有利於減小返工。固然,在面試的時候,若是能圍繞OOP大談特談,天然會加分多多的。面試

開始閱讀本系列博客的預備知識,多態、封裝、面向對象編程等,請經過MSDN學習。以下圖的術語,您應該耳熟能詳的。本系列文章使用C#做爲惟一腳本語言。編程

image

OOP

1 是什麼OOP,以及OOP的優點是什麼?

OOP表明的是面向對象編程(Object-Oriented Programming),它基於對象的總體進行編程,取代了基於過程函數的編程思想。具體實現是圍繞對象進行數據、函數封裝,而不是基於邏輯關係。OOP中的對象直達的是一個特定的類型、或者某類型的實例對象、更多時候是一個class。每一個class對象的結構基本類似,可是有各自特有的屬性和數據值。對象之間可經過對外的接口進行訪問:方法、屬性等。基於OOP的這些優點,獨立的對象能夠修改而不會影響到其餘對象,這樣會比較方便的升級軟件減小潛在的bug。軟件系統隨着時間的推移,會變得愈來愈大,OOP編程思想有效的提升了系統代碼的可讀性和管理性。數組

 

image

2 OOP的概念是什麼?

下面用5個術語來講明OOP的具體概念是什麼:架構

  • 數據抽象(Data Abstraction):數據抽象是對須要操做的物體進行建模的出發點,既對使用對象進行了抽象,隱藏了內部的細節(對使用的最終用戶而言)。用戶能夠很是方便的使用class的方法、數據,而不用關心數據建立、運行邏輯的背後複雜的過程。咱們以真實世界爲例,當你騎一輛自行車的時候,不用考慮變速齒輪的原理如何驅動鏈條、車輪吧。函數

  • 繼承(Inheritance):繼承是OOP概念中最流行的一個概念。繼承給程序員提供了可複用代碼的優點。基類定義好函數邏輯,子類經過繼承,可實現直接訪問--就想子類自身的方法同樣方便。學習

  • 數據封裝(Data Encapsulation):對class的成員變量、成員函數經過訪問控制符進行包裝,則稱爲數據封裝。訪問控制符有public、Protected、Private、Internal 4種類型。this

  • 多態(Polymorphism):對象可經過傳遞不一樣參數實現相同的動做,這種行爲咱們稱之爲多態。咱們以真實世界爲例,「開車」這個方法,對不一樣類型的用戶要提供不一樣的參數實現多態,如Car.Drive(Man), Car.Drive(Woman)等。spa

  • 消息通訊(Message Communication):消息通訊意味着經過經過消息進行class函數的調用、執行。架構設計

 

3 多態(Polymorphism)

在本節,咱們分別用代碼片斷來闡述各自類型的多態類型:函數重載、早期綁定、編譯器的多態。

先建立一個console 工程,並命名爲InheritanceAndPolymorphism,而後添加類Overload.cs,再添加DisplayOverload函數。

   DisplayOverload( +  DisplayOverload( +  DisplayOverload( a,  + a +

Program.cs添加以下代碼:

  Main(= ,

 

運行程序,結果以下:

DisplayOverload 100
DisplayOverload method overloading    
DisplayOverload method overloading100

Overload類中的DisplayOverload提供了3類不一樣的重載函數:方法名相同,參數類型和個數不一樣。C#中的這種方式成爲重載,既咱們不須要爲每類函數定義不一樣名字的函數,僅須要改變函數參數類型和個數便可實現,這個也成爲函數簽名。

用不一樣的返回值能夠否? 咱們試試下面的代碼:

   DisplayOverload(){ }

確定的結果是,Visual Studio會給予以下的報錯信息:

Error: Type 'InheritanceAndPolymorphism.Overload' already defines a member called 'DisplayOverload' with the same parameter types

從上面的結果可知:返回值不做爲多態函數簽名。

 

咱們再運行以下的代碼:

  DisplayOverload(  DisplayOverload(  DisplayOverload( a){  }

 

結果依然是報錯:

Error: Type 'InheritanceAndPolymorphism.Overload' already defines a member called 'DisplayOverload' with the same parameter types

結論:static的可見函數修飾符不做爲重載簽名。

 

運行下面的代碼,試試out、ref能否做爲重載簽名。

  DisplayOverload(  DisplayOverload( =   DisplayOverload(  a) {   }

 

結果是以下的報錯:

Error: Cannot define overloaded method 'DisplayOverload' because it differs from another method only on ref and out

結論:ref、out傳遞參數修飾符也不能做爲重載簽名。

 

4 多態中Params 參數的做用

一個函數可包含以下4種類型的參數傳遞:

  • 值傳遞 (pass by value)

  • 引用傳遞 (Pass by reference)

  • 做爲output參數 (As an output parameter)

  • 使用參數數組 (Using parameter arrays)

 

咱們運行以下代碼:

  DisplayOverload( a,   Display(

 

不出意外,得到以下報錯信息:

Error1: The parameter name 'a' is a duplicate

Error2: A local variable named 'a' cannot be declared in this scope because it would give a different meaning to 'a', which is already used in a 'parent or current' scope to denote something else

 

在相同的做用域中,參數名稱必須是惟一的。

 

在Overload.cs文件中,添加以下代碼:

   name =   name,   Display2(  x,  = = =

在Program.cs中添加以下代碼:

  Main(=

運行結果以下:

Akhil
Akhil 1    
Akhil 2    
Akhil3

image

結論:咱們經過ref引用傳遞了name的內存地址,故修改x、y的值至關於直接修改name的值,故結果運行如上。

 

下面這段代碼演示了params關鍵字的做用:

在Overload.cs文件添加以下代碼:

  , , , ,   DisplayOverload( a,   ( str +   +

在Program.cs文件添加以下代碼:

  Main(=

運行結果以下:

Akhil 100
Mittal 100    
OOP 100    
Akhil 200

C#提供了params動態參數數組機制,很是方便的在運行時動態傳遞不一樣數量的同類型參數。

注:params關鍵詞僅能做爲函數的最後一個參數適用。

 

咱們再試試params關鍵字的函數簽名和非params關鍵字函數簽名的優先級順序:

  , , , ,   DisplayOverload( x,  + x +   +  DisplayOverload(

Program.cs文件添加以下代碼:

  Main(=

運行結果以下:

parameterArray
The two integers 200 300    
parameterArray

從運行結果看,C#很是巧妙的進行非params函數的精準匹配優先,如1個int類型\3個int類型,則用params類型匹配;2個int類型,用明肯定義的函數進行匹配。

 

5 結論

image

在本節中,咱們進行OOP系列的第一篇,主要說明了編譯器的多態,它也稱爲早期綁定或者方法重載。同時,咱們也學習C#中威力強大的params關鍵字,並用它來實現多態。

本文要點概括以下:

  • C#函數重載的簽名規則是用參數的類型和數量判斷,而不是函數的名字。

  • 函數返回值不做爲重載簽名。

  • 修飾符不做爲簽名的一部分,如static

  • 同函數中,多個參數名稱要惟一

  • ref、out是引用傳遞,傳遞的是參數的內存地址

  • params 做爲參數關鍵詞,僅能用於函數的最後一個參數

 

原文地址:http://www.codeproject.com/Articles/771455/Diving-in-OOP-Day-Polymorphism-and-Inheritance-Ear

相關文章
相關標籤/搜索