C 物件導向程式設計三大基本特徵之 封裝

2021-05-22 18:59:34 字數 3298 閱讀 8947

在物件導向的程式設計中,首先要清楚地理解物件導向程式設計的三個基本特徵: 封裝, 繼承, 多型!

封裝:更確切地說,是物件封裝。就是每個物件都包含自己進行某種操作時所需要的所有資訊,而不依賴於其他物件來完成該操作。

下面,通過介紹c#的類,來充分理解物件封裝的概念。

所謂「物件」,形象地說,我們可以把它理解為一塊積木。設計積木的人需要設計積木的外觀與形狀,還有內部的材質。堆積木的人對於內部的材質並不關心,他們只需要根據不同的外觀與形狀來決定堆放的位置。因此,對於開發者而言,要設計物件導向的程式,同時會是兩個迥然不同的身份:設計者與使用者。

先談談使用者。使用者的身份,就是利用已經提供給你的所有物件,根據需求,設計出自己需要實現的程式。就如堆積木的過程。這恰恰是物件導向程式設計的優勢所在,那就是「物件的重用」。已經設計好的物件,可以被不同的使用者呼叫,這些功能既然已經實現,對於使用者而言,當然就免去了自己去設計的過程。正如堆積木那樣,既然有了現成設計好的積木,使用者所要做的工作就是把這些積木最後組合起來,堆成不同的形狀。.net framework所提供的類庫,就是這樣的積木。

例如我們想把乙個int型別轉換成字元型,就沒有必要自己去實現這種轉換,直接呼叫.net framework提供的功能就可以了:

int i = 10;

string s = i.tostring();

再比如我們想彈出乙個windows訊息框,同樣可以直接使用.net framework現有的類庫:

messagebox.show(「message」);

在上述的例子中,i和messagebox都是乙個物件。

再談談設計者的身份。雖然.net framework的類庫功能已經非常強大,但它不可能考慮到業務的方方面面,如果需要使用乙個根本就不存在的物件,此時就需要自己來設計了。例如圖書管理系統,可能就需要使用者,圖書等物件。這就需要開發者自己來設計這些物件。

既然最能體現「物件」思想的型別是「類」,就來看一下c#中的類型別。c#中類的關鍵字是class。在乙個class物件中,主要分為field(字段)、property(屬性)和method(方法),前面兩個對應的是物件的屬性,而method則對應物件的行為。

字串m_name,m_password,m_trycounter就是類user的字段,name,password是類user的屬性,而signin、signout和isvalid則是類user的方法。

前面說到物件好比是乙個積木,設計者需要定義好這個積木的外觀和形狀,也要考慮積木內部的製作,例如選用的材質,以及是空心還是實心。如果將這個積木剖開來看,實際上該物件應分為內、外兩層。由於使用者只關心外部的實現,因此設計者就需要考慮,哪些實現應暴露在外,哪些實現應隱藏於內。這就體現了物件的封裝的思想。

封裝物件,並非是將整個物件完全包裹起來,而是根據具體的需要,設定使用者訪問的許可權。在c#中,分別用修飾符public,internal,protected,private設定,分別修飾類的字段、屬性和方法,甚至於類物件本身:

public:表明所有物件都可以訪問;

protected internal:表明同乙個程式集內的物件,或者該類物件以及其子類可以訪問;

internal:表明只有同乙個程式集的物件可以訪問;

protected:表明只有該類物件及其子類物件可以訪問;(關於繼承,會在以後介紹)

private:表明只有物件本身在物件內部可以訪問;

可以看出,public的開放性最大,其次是protected internal,private的開放性最小。internal和protected居中。那麼,internal和protected哪乙個開放範圍更大呢?我認為,沒有完全絕對的結論。它們的範圍前者體現乙個橫向的概念,後者則體現縱向的概念。如果是internal,那麼外部程式集物件自然不能訪問,但只要是居於同乙個程式集中,則所有物件都可以訪問它;如果是protected,那麼即使是外部程式集物件,只要它繼承了該物件,就可以訪問,而即使是同一程式集,如果物件不是該類物件的子類,也是無法訪問的。打乙個比方,在我們的傳統文化中,是非常強調「宗族」觀念的,乙個宗族的族長,對於本族人而言,權力極大,甚至掌握了生殺大權。以乙個州府的範圍為例,internal就好比是知府大人,只要是該州府的百姓,都屬於他的管轄範圍,而不管他是哪乙個宗族。protected則好比是宗族的族長,只要是這個宗族的成員,都要服從他,哪怕該成員屬於其他州府。

以前面定義的user類而言,所有的字段m_name,m_password,m_trycounter都是private的,因此user類的外部呼叫者無法呼叫它們,但請注意user類內部的方法比如signin或者屬性name,卻完全可以呼叫。同樣的,private方法isvalid,可以被signin方法呼叫,但對於外部呼叫者而言,則是無法呼叫的。而對於public屬性name,password,public方法signin和signout,外部的呼叫者是可以訪問的。在後面的演練中,我們能夠看出這之間的區別。通過這樣分層次的封裝,就可以充分保證物件的重用性和安全性。

那麼對於類型別而言,如何確定它們的訪問許可權呢?這要根據實際的需求來看了。假定這個user類是用於乙個電子商務**。那麼電子商務系統在設計過程中,就需要呼叫到user類物件。顯然,登入與退出功能是必須提供給外部使用者的,例如登入頁面就會使用到user類。而isvalid()方法用於驗證使用者的合法性,雖然也非常必要,但該功能僅僅用於登入的時候核實使用者身份,也就是說,isvalid方法只會被signin方法使用,但外部實用者卻並不關心,因此,設定為private就是合理的。同樣的道理,欄位m_trycounter也是如此。但如果需求發生改變,驗證使用者的功能不僅僅是登入的時候需要使用,在新增商品到購物車,下訂單,付款的時候,都需要該功能,那麼isvalid方法,就有必要修改為public方法了。

所以,在設計程式的時候,除了要考慮識別物件,還要充分考慮該物件的封裝。類物件內的字段、屬性和方法,包括類本身,哪些應該暴露在外,哪些應該被隱藏,都需要根據實際的需求,給與正確的設計。

5、在彈出的對話方塊中,將檔案的名字命名為user.cs

user.signout();

//使用者名稱正確,密碼錯誤;

user.name = "admin";

user.password = "test";

for (int i=0;i<=4;i++)

user.signout();

//使用者名稱和密碼正確;

user.name = "admin";

user.password = "admin";

for (int i=0;i<=4;i++)

user.signout();

//注意此時是無法呼叫這樣的字段和方法的;

//user.m_name;

//user.m_password;

//user.isvalid();

console.readline();}}

8、執行

物件導向的三大基本特徵

封裝 定義 隱藏內部實現,穩定外部介面 1.屬性封裝了例項變數 2.方法封裝了具體實現的 3.類封裝了屬性和方法 作用 1.使用起來更加簡單 2.變數更加安全 3.可以隱藏內部實現細節 4.開發速度更加快捷 為什麼使用繼承?在開發過程中,我們會發現很多 相同,特別是建立一些類的時候,發現類與類之間有...

簡述物件導向三大基本特徵

物件導向的三大基本特徵 封裝,繼承,多型 封裝的好處 1 保證資料的安全性 2 提供清晰的對外介面 3 類內部實現可以任意修改,不影響其它類 繼承是指這樣一種能力 通過繼承建立的新類稱為 子類 或 派生類 被繼承的類稱為 基類 父類 或 超類 要實現繼承,可以通過 繼承 inheritance 和 ...

物件導向的三個基本特徵 物件導向基本特徵

物件導向的三個基本特徵 封裝是物件和類概念的主要特徵,就是把客觀的封裝起來,只對外暴露出來,並把自己的資料和方法只讓可信的類或物件操作作用 隱藏實現細節,使得 模組化 使用現有類的所有功能,並且無需重新編寫原來的類中的方法對這些功能的擴充套件,oc只能實現單繼承,如果想要實現多繼承的話可以通過分類或...