基礎系列之 3 物件的封裝與C 的類 (參考)

2022-07-20 20:39:12 字數 2683 閱讀 4992

以下內容摘自園子裡精彩的部分!

物件導向思想有三個核心要素:封裝、繼承與多型。c#中,所有資料型別的例項都是「物件」,不過最能體現物件特質的型別,還是「類」,同時它也是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則對應物件的行為。乙個典型的class定義如下所示:

public class user

set

}public string password

set

}public void signin()

was signed in.", m_name);

}else

is invalid. can』t sign in.", m_name);}}

else

}public void signout()

was signed out.", m_name);

} private bool isvalid()

else}}

字串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:表明只有物件本身在物件內部可以訪問;

以前面定義的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方法了。

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

基礎 C 的類與物件 封裝

c 物件導向的三大特性為 封裝 繼承 多型 c 認為萬事萬物都皆為物件,物件上有其屬性和行為 例如 人可以作為物件,屬性有姓名 年齡 身高 體重 行為有走 跑 跳 吃飯 唱歌 車也可以作為物件,屬性有輪胎 方向盤 車燈 行為有載人 放 放空調 具有相同性質的物件,我們可以抽象稱為類,人屬於人類,車屬...

3物件的共享

作用 將當前執行緒對volatile的改變立即通知給其他執行緒 保證了volatile變數對執行緒的可見性 volatile是一種比synchronizyed稍弱的同步機制 對可見性的影響 volatile變數對可見性的影響比volatile變數本身更為重要。當執行緒a首先寫入乙個volatile變...

C 基礎3(物件以及友元)

引數個數不定,可以是任意多。可變引數va int sum int num,va end vp return sum class student 需要在外部進行賦值 使用 int student tag 11 void main class student 會報錯 限制this關鍵字 不能對類的屬性進...