面向對象的編程區別於面向過程的編程,其操作的單元是類,而面向過程操作的單元是方法。即面向過程的編程是由一個又一個的方法組成的。而面向對象的編程是由一個又一個類組成的。相對於面向過程,面向對象的代碼復用性更好,代碼的隱蔽性更高,並且更加符合人類思維的方式。 ...
面向對象的編程區別於面向過程的編程,其操作的單元是類,而面向過程操作的單元是方法。即面向過程的編程是由一個又一個的方法組成的。而面向對象的編程是由一個又一個類組成的。相對於面向過程,面向對象的代碼復用性更好,代碼的隱蔽性更高,並且更加符合人類思維的方式。
面向對象的最基礎的單元就是類。類(Class)是一個抽象的概念,是對某一類事物的描述。例如:貓,狗,人。而對象(object)就是類的實例化。即符合類描述的具體的單個成員。例如我就是Person類實例化的對象。我是符合人描述的具體的單個成員。在創造對象的過程就叫做類的實例化。
類包含描述某種事物的狀態(例如姓名,性別)和行為(唱歌,跳舞,寫代碼)。
在.net平臺而言,最基本的編程結構就是類類型。正式的說,類是由欄位數據(通常叫做成員變數)以及操作這個數據的成員(如構造函數,屬性,方法,事件等)所構成的自定義類型。其中欄位數據表示狀態。
Class Person { //表示自身狀態的欄位 String Name; String Sex; //表示行為的方法 Public void Sing(); Public void Dance(); Public void Coding(); }
面向對象編程(OOP)的三個特性:
1.封裝性
封裝是將對象用戶(用你編寫的類進行編程的人)不必瞭解的實現細節隱藏起來的一種語言能力。
1 //DatabaseReader封裝了資料庫操作的細節 2 DatabaseReader dbReader = new DatabaseReader(); 3 dbReader.Open(@"C:\AutoLot.mdb");
和封裝編程邏輯緊密相關的概念就是數據的保護概念。理想情況下對象的狀態數據都應該是隱蔽的,外部不能直接的訪問,只能通過訪問函數來進行“有禮貌的訪問”。
2.繼承性
繼承指的是基於已有的類型來創建心類的語言能力。通過繼承,子類可以繼承基類(或稱父類)的核心功能,並且擴展了基類的行為。
從圖中我們可以看出“矩形是圖形,圖形是對象”這就構建成了一種“is - a”的關係,Is- a關係又稱為繼承關係。
我們會認為Shape定義了許多派生類都公有的成員(顏色,高度)。由於Rectangle擴展了Shape,它也就繼承了由Shape和Object定義的核心功能。同時它還有屬於自己獨特的功能。
區別於C++,C#不支持多重繼承的概念(所以引入了介面的概念)繼承的一個很大的優點就是提高了代碼的復用性,OOP中還有另外的一種形式的代碼重用:包含/委托模型(has-a關係,也成聚合)這種重用的形式不是用來建立父類和子類關係的。它意味著,一個類可以定義另一個類的成員變數,並向對象用戶間接的公開它的功能。
例如構建一個汽車(Car)的類,想表達一輛車中有一個(has-a)收音機的概念。讓Car繼承Radio類顯然是不符合邏輯的。需要的是兩個類一起合作,其中Car類創建並公開了Radio的功能。
1 Class Car 2 { 3 Radio _Radio; 4 } 5 Class Radic 6 { 7 8 }
3.多態性
同一操作作用於不同的對象,可以有不同的解釋,產生不同的執行結果,這就是多態性。
實際上就是同一個類型的實例調用“相同”的方法,產生的結果是不同的。這裡的“相同”打上雙引號是因為這裡的相同的方法僅僅是看上去相同的方法,實際上它們調用的方法是不同的。
當CirCle和Rectangle都調用Draw()的時候,看似這兩個實例調用了“相同”的方法,但是實際上,它們是調用各自的Draw()方法。所以只是看似相同,實際上是不同的方法。並且產生了不同的執行結果,這就是多態性。
同時,這裡講的多態性也只是簡單的多態性。多態性用來當基類規定好一些實現的方法時,子類只需要重寫這些方法就好。這樣增強了代碼的復用性。