一、物件導向程式設計的含義
* 是一種模組化程式設計方法,使程式碼的重用性大大的增加。
* oop技術使得專案的設計階段需要的精力大大的增加,但是一旦對某種型別的資料表達方式達成一致,這種表達方式就可以沿用下去,直到這款應用的生命週期結束。
1、物件就是OOP應用程式的一個組成部分,這個組成部件封裝了部分應用程式,這部分程式可以是一個過程、一些資料或一些更抽象的實體。物件的型別在OOP中有個特殊的名稱叫做類。可以使用類來定義一個物件。
PS:術語“類”和“物件”常常被混淆,但簡單的來講就是,類是模板,而物件是模板做出來的產品
(我們將使用統一的建模語言UML語法來研究類和物件)
比如說Printer和MyPrinter來用UML區別一下類和物件
2、屬性和欄位
(1)可以通過屬性和欄位訪問物件中包含的資料。這個物件資料可以用於區分不同的物件,因為同一個類的不同物件在屬性和欄位中儲存了不同的值。
(2)屬性和欄位是不同的,因為屬性不提供對資料的直接訪問。
(3)UML圖
a、可訪問性:+號表示公共成員,-號表示私有成員。
b、成員名
c、成員的型別
2、方法
(1)UML圖
a、其語法類似於欄位和屬性,但最後顯示的型別是返回型別,在這一部風彙總還顯示了方法的引數。
b、in、out和inout他們用於表示資料流的方向,其中out和inout大致對應與學習筆記(五)中討論的C#關鍵字out和ref。in 大致對應於C#中不適用這兩個關鍵字的情景。
3、一切皆物件
4、物件的生命週期
(1)兩個重要的階段:
a、構造階段:物件最初進行例項化的時期。這個初始化過程稱為構造階段,由建構函式完成。
b、解構函式:在刪除一個物件時,常常需要執行一些清理工作,例如釋放記憶體,這由解構函式來完成。
(2)建構函式:
物件的初始化工程是自動完成的,但是,在初始化物件的過程中,需要初始化物件儲存的資料。建構函式就是用於初始化資料的函式。
所有的類有包括一個以上的建構函式,在這些函式中:有一個預設的建構函式,該函式沒有引數,名字和類名一樣。類可能還包括幾個帶引數的建構函式,稱為非預設的建構函式。程式碼可以使它們以許多的方式例項化物件。
在C#中,用new關鍵字來呼叫建構函式。
建構函式與欄位和屬性一樣,可以是共有或私有的。在類外部的外碼不能使用私有建構函式來例項化物件,而必須使用公共的建構函式。
(3)解構函式
不應該依賴解構函式來書房物件例項所使用的函式,因為在不再使用某個物件後,該資源會長時間被該物件佔用。如果所使用的資源非常重要,這樣做就有可能出問題。(後面的會有解決的辦法)。
4、靜態和例項類函式
(1)類還有靜態成員,靜態成員可以在類的例項之中共享,在使用靜態成員的時候甚至不需要例項化物件。
UML圖表示法:
在UML圖中,類的靜態成員用下劃線表示。
(2)靜態建構函式
使用類中的靜態成員時,需要預先初始化這些成員。使用靜態建構函式可以執行這種初始化任務,一個雷只能有一個靜態建構函式,但是建構函式不能帶有訪問修飾符,也不能帶任何引數。
靜態建構函式不能直接呼叫,只能在下述情況中執行:
a、建立包含靜態建構函式的類例項時
b、訪問含靜態建構函式的類的靜態成員時
(3)靜態類
如果我們想類只含有靜態成員,一種簡單的方法就是使用靜態類,而不是把類的建構函式設定為私有,靜態類只能包含靜態成員。
二、OOP技術
1、介面
(1)介面是把公共例項(非靜態)方法和屬性組合起來,以封裝特定方法的集合。
(2)注意,介面不能單獨存在,不能像例項化一個類那樣例項化介面。另外,介面不能包含實現其成員的任何程式碼,而只能定義成員本身。實現過程必須在實現介面的類中完成。
(3)UML語言在物件上實現介面。(一般介面的名稱一般用大寫字母I開頭)
(4)一個類可以支援多個介面,多個類也可以使用同一個介面。
(5)在釋出介面之後(比如說我們使用的MATLAB),即介面可以用於其他開發人員或終端使用者後,最好不要修改它。如果以後做了修改,也許是升級了底層的程式碼,但是也許會導致使用者不能正確執行介面,甚至失敗,我們應建立一個新的介面,來擴充套件舊介面,例如可以包含一個版本號。
(6)支援IDisposable介面的物件必須實現其Dispose()方法,即他們必須提供這個方法的程式碼。當不再需要某個物件的時候就呼叫這個方法,釋放重要的資源,負責,該資源會等到解構函式的時候才釋放。
C#允許使用一種可以優化使用這個方法的結構。using關鍵字可以在程式碼塊中初始化使用重要資源的物件,會在這個程式碼塊的末尾自動呼叫Dispose()方法,用法如下:
<ClassName><VariableName> = new <ClassName>() …… using(<VaribaleName>) { …… }
或者也可以:
using(<ClassName><VariableName> = new <ClassName>()) { …… }
可以在using程式碼塊中使用變數<VariableName>,並在程式碼塊的末尾自動刪除(在程式碼塊執行完畢後,呼叫Dispose())。
2、繼承
(1)任何類都可以從另一個類中繼承,這就是說,這個類擁有他繼承的類的所有成員。在OOP中,被繼承(派生)的類成為父類(基類)。
Attention:注意C#中的物件只能直接派生於一個基類。
(2)UML圖中來表示基類。
用一個箭頭來表示繼承的關係。
(2)派生類不能訪問基類的私有成員,但是可以訪問其公有和受保護的成員。而外部程式碼只能訪問公有成員,而不能訪問私有成員還有受保護成員。
(3)基類可以定義為抽象類,抽象類不能夠直接例項化,要使用這個類,必須繼承這個類,抽象類中有抽象成員,這些成員在基類中沒有實現程式碼,這些程式碼的實現是在派生類中提供。
Attention:介面也可以繼承自其它介面,但與類不同的是,介面可以繼承多個基介面。
三、多型性
(1)多型性是指某個派生型別的變數可以賦給基本型別的變數,而不用進行強制型別轉換就可以通過這個變數來呼叫基類的方法,但最終的結果是呼叫了派生類中的方法來實現程式碼。
(2)基本型別轉換成派生型別的時候需要使用強制型別的轉換。
(3)C#中,所有的類都派生於Object這類。
(4)介面的多型性:儘管介面不能例項化,但是可以建立介面型別的變數,然後就可以在支援該介面的物件上使用這個變數訪問該介面提供的方法和屬性。
4、物件之間的關係:
包含、集合
5、運算子過載
簡而言之,就是重新定義C#中已有的運算子的法則。
6、事件:
物件可以啟用事件,作為他們處理的一部分。暫時可以理解為中斷、
7、引用型別和值型別
換句話說就是指標和變數。