c 基礎知識 2

2022-03-22 04:17:41 字數 3271 閱讀 5529

物件導向的三大特徵之一: 封裝

具體來說,封裝隱藏了類內部的具體實現細節,對外則提供統一訪問介面,來操作內部資料成員。這樣實現的好處是實現了ui分離,程式設計師不需要知道類內部的具體實現,只需按照介面協議進行控制即可。同時對類內部來說,封裝保證了類內部成員的安全性和可靠性。

也就是說,封裝就是乙個包裝,將包裝的內外分為兩個空間,對內實現資料私有,對外實現方法呼叫,保證了資料的完整性和安全性。

先了解下欄位、屬性和方法

1.字段

字段(field)通常定義為private,表示類的狀態資訊。clr支援唯讀和讀寫字段。值得注意的是,大部分情況下字段都是可讀可寫的,唯讀字段只能在建構函式中被賦值,其他方法不能改變唯讀字段。常見的字段定義為:

public

class

client

類的字段資訊最好以私有方式提供給類的外部,而不是以公有方式來實現,否則不適當的操作將造成不必要的錯誤方式。

那麼,如上文所言,將字段設定為private後,對物件狀態資訊的控制又該如何實現呢?同時我們也期望除了實現對資料的訪問,最好能加入一定的操作,達到資料控制的目的。因此,物件導向引入了另乙個重量級的概念:屬性。

2.屬性

屬性(property)通常定義為public,表示類的對外成員。屬性具有可讀、可寫屬性,通過get和set訪問器來實現其讀寫控制。例如上文中client類的字段,我們可以相應地封裝其為屬性:

public

class

client

set }

private

int age; //

使用者年齡

public

intage

set

else

}   }

}

當我們再次以 xiaowang.age = 1000; 這樣的方式來實現對小王的年齡進行寫控制時,自然會彈出異常提示,從而達到了保護資料完整性的目的。

3.方法

方法(method)封裝了類的行為,提供了類的對外表現。用於將封裝的內部細節以公有方法提供對外介面,從而實現與外部的互動與響應。例如,從上面屬性的分析我們可知,實際上對屬性的讀寫就是通過方法來實現的。因此,對外互動的方法,通常實現為public。

當然不是所有的方法都被實現為public,否則類內部的實現豈不是全部暴露在外。必須對對外的行為與內部操作行為加以區分。因此,通常將在內部的操作全部以private方式來實現,而將需要與外部互動的方法實現為public,這樣既保證了對內部資料的隱藏與保護,又實現了類的對外互動。例如在atm類中,對錢的計算、使用者驗證這些方法涉及銀行的關鍵資料與安全資料的保護問題,必須以private方法來實現,以隱藏對使用者不透明的操作,而只提供返回錢款這一public方法介面即可。在封裝原則中,有效地保護內部資料和有效地暴露外部行為一樣關鍵。

總結:字段通常定義為private,屬性通常實現為public,而方法在內部實現為private,對外部實現為public,從而保證對內部資料的可靠性讀寫控制,保護了資料的安全和可靠,同時又提供了與外部介面的有效互動。這是類得以有效封裝的基礎機制。

裝性旨在保證:

隱藏系統實現的細節,保證系統的安全性和可靠性。

提供穩定不變的對外介面。因此,系統中相對穩定部分常被抽象為介面。

封裝保證了**模組化,提高了軟體的復用和功能分離。 

物件導向的三要素之一: 多型

1、多型的分類

根據其實現的方式我們可以進一步分為基類繼承式多型和介面實現式多型。

(1)基類繼承多型

基類繼承多型的關鍵是繼承體系的設計與實現,在fileloader系統中file類作為所有資料型別的基類,然後根據需求進行逐層設計,我們從架構設計圖中可以清楚地了解繼承體系關係。在客戶端呼叫時,多型是以這種方式體現的:

files myfile = new wordfile();

myfile.open();

myfile是乙個父類files變數,保持了指向子類wordfile例項的引用,然後呼叫乙個虛方法open,而具體的呼叫則決定於執行時而非編譯時。從設計模式角度看,基類繼承式多型體現了一種is-a方式,例如wordfile is-a files就體現在這種繼承關係中。

(2)介面實現式多型

多型並非僅僅體現在基於基類繼承的機制中,介面的應用同樣能體現多型的特性。區別於基類的繼承方式,這種多型通過實現介面的方法約定形成繼承體系,具有更高的靈活性。從設計模式的角度來看,介面實現式多型體現了一種can-do關係。同樣,在萬能載入器的客戶端呼叫時,也可以是這樣的實現方式:

ifileopen myfile = new wordfile();

myfile.open();

當然,很多時候這兩種方式都是混合應用的,就像本節的fileloader系統的實現方式。

2、多型的執行機制

從技術實現角度來看,是.net的動態繫結機制成就了物件導向的多型特性。那麼什麼是動態繫結,.net又是如何實現動態繫結呢?

動態繫結,又叫晚期繫結,是區別與靜態繫結而言的。靜態繫結在編譯期就可以確定關聯,一般是以方法過載來實現的;而動態繫結則在執行期通過檢查虛擬方法表來確定動態關聯覆寫的方法,一般以繼承和虛方法來實現。在.net中,虛方法以virtual關鍵字來標記,在子類中覆寫的虛方法則以override關鍵字標記。從設計角度考量,通常將子類中共有的但卻容易變化的特徵抽取為虛函式在父類中定義,而在子類中通過覆寫來重新實現其操作。

關於.net通過什麼方式來實現虛函式的動態繫結機制,在此,我們提取萬能載入器fileloader中的部分**,來深入分析通過虛方法進行動態繫結的一般過程:

abstract

class

files: ifileopen }

abstract

class

docfile: files }

class

wordfile : docfile

}

在繼承體系的實現基礎上,接著是客戶端的實現部分:

files myfile = new wordfile();

myfile.open();

針對上述示例,具體的呼叫過程,可以小結為:

編譯器首先檢查myfile的宣告型別為files,然後檢視myfile呼叫方法是否被實現為虛方法。如果不是虛方法,則直接執行即可;如果是虛方法,則會檢查實現型別wordfile是否重寫該方法open,如果重寫則呼叫wordfile類中覆寫的方法,例如本例中就將執行wordfile類中覆寫過的方法;如果沒有重寫,則向上遞迴遍歷其父類,查詢是否覆寫該方法,直到找到第乙個覆寫方法呼叫才結束。

3.多型的規則和意義

C 基礎知識 (2)

目的 在類中,不希望某些資料被修改,可以用const關鍵字加以限定 初始化 const 成員變數只有一種方法,就是通過建構函式的初始化列表 建構函式初始化列表 student student char name,int age,float score m name name m age age m ...

C 基礎知識(2)

c 基礎知識 1.預設引數函式 c語言中在函式呼叫時形參從實參取得,但是在c 中提供一種簡單處理方法給形參乙個預設值,當呼叫函式時,若該形參未傳入引數,則形參使用定義時的預設值。ps 注意傳參規則 實參與形參的結合是從左到右順序進行,所以有預設值的形參必須放在最右側。2.函式過載 c 中乙個函式名可...

C 基礎知識整理 基礎知識(2) 類

類,是物件導向語言的基礎。類的三大特性 封裝 繼承 多型。最基本的特性就是封裝性。程式設計師用程式描述世界,將世界的所有事物都看成物件,怎麼描述這個物件?那就是類了。也就是用類來封裝物件。用書上的話說,類是具有相同屬性和行為的物件的抽象。寶馬汽車 別克汽車 五菱之光汽車.基本具有相同的屬性和行為,所...