04.03 精通c# -- OOP三大支柱

就.NET平臺而言,最基礎的編程結構就是類類型,類是由字段數據(成員變量)以此操作這個數據的成員(構造函數、屬性、方法、事件等等)所構成的自定義類型。類型的對象創建以後,就可以直接訪問類的公共成員,對象這個術語表示使用new關鍵字創建的某個類類型的實例。對象必須使用new關鍵字來分配到內存中,通過new關鍵字把引用賦給對象之後,這個引用才會指向內存中的有效類實例。

類或結構可以通過static來定義靜態成員,這樣的話,這些成員就只能從類級別調用,而不是從對象引用變量進行調用。

工具類(只包含靜態功能的類或結構稱為工具類)是不維護任何對象級別的狀態且並非由new關鍵字創建的類,因此,工具類會以類級別(即靜態)成員公開所有功能。不需要先進行分配。

如果類定義了非靜態數據(或者說實例數據),類型的每一個對象都會維護字段的獨立副本。相較而言,定義類的靜態數據時,同一級別的所有對象都會共享內存(分配一次)

創建新實例的時候,靜態數據的值不會重置,因為CLR把數據分配到內存中只會進行一次。

構造函數,因為有些對象用戶希望在使用對像之前先給對象的數據字段賦予相關的值。類可以接受任意構造函數來允許對象來允許對象在創建對象時創建狀態。

靜態構造函數不允許訪問修飾符並不接受任何參數。無論創建了多少類型的對象,靜態構造函數只會執行一次,優先執行(不允許重載)。

This關鍵字來提供對當前實例的訪問(自定義構造函數是可以解決傳入參數和字段名稱同名時造成的作用域歧義)。

封裝:這是將對象用戶不必瞭解的實現細節隱藏起來的一種語言能力(隱藏一個對象的實現並且保護數據的完整性)。

和封裝編程緊密相關的概念是數據保護的概念,因為公共的數據點很容易破壞。

繼承:指基於已有的類定義來創建新類定義的語言能力。通過繼承,子類可以繼承基類(父類)的核心功能,並且擴展基類的行為(促進代碼重用)。“is-a”關係

多態:表示的是語言以同一種方式處理相關對象的能力。準確的說,這個面嚮對象語言的原則允許基類為所有派生類定義一個成員集合(多態接口),一個類類型的多態接口由任意個虛擬(virtual)或抽象(abstract)成員組成(同樣的方式處理相關對象或者說相關類型如何對相同的請求做出不同的響應)。

虛擬成員是定義默認實現的基類中的成員,他可能被派生類改變(重寫),而抽象方法是基類中不提供默認實現的成員,但抽象方法必須被派生類重寫。當派生類重寫有基類定義的成員時,其實就重定義了響應相同請求的方式。

對象的內部數據不應該從對象實例直接訪問,對象數據應該被定義為私有的,如果調用者想改變隊形的狀態,就要間接的使用公共成員。(表示對象狀態的類成員都不應該被標記為公共的)

C#傾向於使用屬性來封裝數據,好處在於對象的使用者可以使用單個命名的項來控制內部數據點。

在新建對象時可以通過構造函數指定初始值,而屬性允許我們安全的獲取或設置實際的數據。

coust類的常量字段是隱式靜態的,定義常量時必須指定初始值,和readonly只讀字段不一樣,需要編譯時就要知道,而只讀字段(不是隱式靜態的)是可以在運行是決定,可以在構造函數賦值。常量不可以。(永不改變的數據點)

封裝,如何使用構造函數和各種成員(構造函數、字段、屬性、方法、只讀字段等)來構建一個定義明確的類類型。

繼承,可以促進代碼重用,基本思想是新的類可以利用既有類的功能。繼承保護了封裝,不能通過對象引用來訪問私有成員。

.NET平臺允許某一個類(或結構)類型實現許多獨立的接口。這樣,c#類型可以實現很多行為,有避免了多重繼承的複雜性,一個類只允許一個直接基類,但一個接口可以直接從多個接口派生。

Sealed 密封類,用於類類型來來防止其他類型通過繼承擴展其行為。

C#結構總是隱式密封的,我們不可以從結構繼承結構,從類繼承機構或從結構繼承類,結構只能獨立建模。

基類用於定義所有派生類共有的特性,子類通過增加特定的行為來擴展這些一般功能。

包含/委託(聚合)就是增加公共成員到包含類,以便使用被包含對象的功能。(可能是把類作為新類的字段使用???)

多態為子類定義了一種方式,使其可以定義由其基類定義的方法。這種方法叫重寫。(virtual、override),被override標記的方法叫虛方法。當不使用override而使用new時就會隱藏任何此類之上的該方法的實現。

Abstract 抽象類,定義了卻不能直接創建它(實例化),但它們包含了派生類型中所有的通用數據和功能,我們可以用抽象基類變量來保存任何指向任何子類的引用。使用抽象,我們可以為那些不是具體實體的東西建模。我們不能直接實例化抽象類,但是在創建派生類時,會在內存中對其進行組裝。定義若干在分配派生類時間接調用的構造函數是很正常的。

如果類被定義為抽象基類,他就可以定義許多抽象成員。當你希望定義沒有提供默認實現而不需在每個派生類中實現的成員時,就可以使用抽象成員。這樣強調了每一個後代具有多態接口,他們需要自己處理抽象方法的細節。,可以構建高度靈活的應用程序。使用抽象基類變量來保存指向任何子類的引用。

多態:允許子類型指針賦值給父類型的指針,也就是同一操作作用於不同的對象,有不同的解釋,產生不同的結果。

作用:把不同的子類當作父類看,屏蔽不同子類的差異,以通用的代碼適應不斷變化的需求。

類類型之間的強制轉換的第一條準則就是如果兩個類通過“is-a”關係關聯,在基類引用中保存派生類型總是安全的 “基類 實例名=new 派生類”,這是隱式轉換,因為基於繼承的規則。第二條規則是強制裝換操作符進行顯示的向下轉換(顯式強制轉換在運行時而不是在編譯時進行運算,編譯可能通過,但可能會發生運行時異常)。

As在轉換時可以用來判斷是否能夠兼容(例:aa a=(aa)bb可以寫作aa a=bb as aa,當不兼容時,a的職為null)。

Is關鍵字有著和as一樣的作用,但是is不兼容會返回false(例:if(bb is aa){};)。

Equals()的默認行為用來測試兩個變量是不是指向內存中的同一對象,但是對string類型時被重寫了,用於判斷兩個值的內容。


分享到:


相關文章: