新聞中心
.Net Framework的類庫(kù)功能已經(jīng)非常強(qiáng)大,但它不可能考慮到業(yè)務(wù)的方方面面,如果需要使用一個(gè)根本就不存在的對(duì)象,此時(shí)就需要自己來(lái)設(shè)計(jì)了。例如圖書管理系統(tǒng),可能就需要用戶,圖書等對(duì)象。這就需要開(kāi)發(fā)者自己來(lái)設(shè)計(jì)這些對(duì)象。

創(chuàng)新互聯(lián)長(zhǎng)期為上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為昭平企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)、網(wǎng)站制作,昭平網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
既然最能體現(xiàn)“對(duì)象”思想的類型是“類”,我就來(lái)介紹一下C#中的類類型。C#中類的關(guān)鍵字是class。在一個(gè)class對(duì)象中,主要分為field(字段)、property(屬性)和method(方法),前面兩個(gè)對(duì)應(yīng)的是對(duì)象的屬性,而method則對(duì)應(yīng)對(duì)象的行為。一個(gè)典型的class定義如下所示:
- publicclassUser
- {
- privatestringm_name;
- privatestringm_password;
- privateintm_tryCounter;
- publicstringName
- {
- get{returnm_name;}
- set{m_name=value;}
- }
- publicstringPassword
- {
- get{returnm_password;}
- set{m_password=value;}
- }
- publicvoidSignIn()
- {
- if(m_tryCounter<3)
- {
- if(IsValid())
- {
- m_tryCounter=0;
- Console.WriteLine("User{0}wassignedin.",m_name);
- }
- else
- {
- m_tryCounter++;
- Console.WriteLine("User{0}isinvalid.Can’tSignin.",m_name);
- }
- }
- else
- {
- Console.WriteLine("Youtrytosigninmorethan3times.Youarebedenied.");
- }
- }
- publicvoidSignOut()
- {
- m_tryCounter=0;
- Console.WriteLine("User{0}wassignedout.",m_name);
- }
- privateboolIsValid()
- {
- if(m_name.ToUpper()=="ADMIN"&&m_password=="admin")
- {
- returntrue;
- }
- else
- {
- returnfalse;
- }
- }
- }
字符串m_name,m_password,m_tryCounter就是類User的字段,Name,Password是類User的屬性,而SignIn、SignOut和IsValid則是類User的方法。
前面說(shuō)到對(duì)象好比是一個(gè)積木,設(shè)計(jì)者需要定義好這個(gè)積木的外觀和形狀,也要考慮積木內(nèi)部的制作,例如選用的材質(zhì),以及是空心還是實(shí)心。如果將這個(gè)積木剖開(kāi)來(lái)看,實(shí)際上該對(duì)象應(yīng)分為內(nèi)、外兩層。由于使用者只關(guān)心外部的實(shí)現(xiàn),因此設(shè)計(jì)者就需要考慮,哪些實(shí)現(xiàn)應(yīng)暴露在外,哪些實(shí)現(xiàn)應(yīng)隱藏于內(nèi)。這就體現(xiàn)了對(duì)象的封裝的思想。
封裝對(duì)象,并非是將整個(gè)對(duì)象完全包裹起來(lái),而是根據(jù)具體的需要,設(shè)置使用者訪問(wèn)的權(quán)限。在C#中,分別用修飾符public,internal,protected,private設(shè)定,分別修飾類的字段、屬性和方法,甚至于類對(duì)象本身:
◆public:表明所有對(duì)象都可以訪問(wèn);
◆protected internal:表明同一個(gè)程序集內(nèi)的對(duì)象,或者該類對(duì)象以及其子類可以訪問(wèn);
◆internal:表明只有同一個(gè)程序集的對(duì)象可以訪問(wèn);
◆protected:表明只有該類對(duì)象及其子類對(duì)象可以訪問(wèn);(關(guān)于繼承,會(huì)在以后介紹)
◆private:表明只有對(duì)象本身在對(duì)象內(nèi)部可以訪問(wèn);
可以看出,public的開(kāi)放性***,其次是protected internal,private的開(kāi)放性最小。internal和protected居中。那么,internal和protected哪一個(gè)開(kāi)放范圍更大呢?我認(rèn)為,沒(méi)有完全絕對(duì)的結(jié)論。它們的范圍前者體現(xiàn)一個(gè)橫向的概念,后者則體現(xiàn)縱向的概念。如果是internal,那么外部程序集對(duì)象自然不能訪問(wèn),但只要是居于同一個(gè)程序集中,則所有對(duì)象都可以訪問(wèn)它;如果是protected,那么即使是外部程序集對(duì)象,只要它繼承了該對(duì)象,就可以訪問(wèn),而即使是同一程序集,如果對(duì)象不是該類對(duì)象的子類,也是無(wú)法訪問(wèn)的。打一個(gè)比方,在我們的傳統(tǒng)文化中,是非常強(qiáng)調(diào)“宗族”觀念的,一個(gè)宗族的族長(zhǎng),對(duì)于本族人而言,權(quán)力極大,甚至掌握了生殺大權(quán)。以一個(gè)州府的范圍為例,internal就好比是知府大人,只要是該州府的百姓,都屬于他的管轄范圍,而不管他是哪一個(gè)宗族。protected則好比是宗族的族長(zhǎng),只要是這個(gè)宗族的成員,都要服從他,哪怕該成員屬于其他州府。我以前看過(guò)《雍正王朝》,其中就有這樣一個(gè)情節(jié),身為皇子的胤禎,竟然無(wú)法挽救自己心愛(ài)女人的命運(yùn),因?yàn)檫@個(gè)女人違反了她們宗族的族規(guī),***眼看著她被活活燒死,卻只能黯然神傷,夢(mèng)里縈回。
以前面定義的C# User類而言,所有的字段m_name,m_password,m_tryCounter都是private的,因此C# User類的外部調(diào)用者無(wú)法調(diào)用它們,但請(qǐng)注意User類內(nèi)部的方法比如SignIn或者屬性Name,卻完全可以調(diào)用。同樣的,private方法IsValid,可以被SignIn方法調(diào)用,但對(duì)于外部調(diào)用者而言,則是無(wú)法調(diào)用的。而對(duì)于public屬性Name,Password,public方法SignIn和SignOut,外部的調(diào)用者是可以訪問(wèn)的。在后面的演練中,我們能夠看出這之間的區(qū)別。通過(guò)這樣分層次的封裝,就可以充分保證對(duì)象的重用性和安全性。
那么對(duì)于類類型而言,如何確定它們的訪問(wèn)權(quán)限呢?這要根據(jù)實(shí)際的需求來(lái)看了。假定這個(gè)User類是用于一個(gè)電子商務(wù)網(wǎng)站。那么電子商務(wù)系統(tǒng)在設(shè)計(jì)過(guò)程中,就需要調(diào)用到C# User類對(duì)象。顯然,登錄與退出功能是必須提供給外部使用者的,例如登錄頁(yè)面就會(huì)使用到C# User類。而IsValid()方法用于驗(yàn)證用戶的合法性,雖然也非常必要,但該功能僅僅用于登錄的時(shí)候核實(shí)用戶身份,也就是說(shuō),IsValid方法只會(huì)被 SignIn方法使用,但外部實(shí)用者卻并不關(guān)心,因此,設(shè)置為private就是合理的。同樣的道理,字段m_tryCounter也是如此。但如果需求發(fā)生改變,驗(yàn)證用戶的功能不僅僅是登錄的時(shí)候需要使用,在添加商品到購(gòu)物車,下訂單,付款的時(shí)候,都需要該功能,那么IsValid方法,就有必要修改為 public方法了。
所以,在設(shè)計(jì)程序的時(shí)候,除了要考慮識(shí)別對(duì)象,還要充分考慮該對(duì)象的封裝。類對(duì)象內(nèi)的字段、屬性和方法,包括類本身,哪些應(yīng)該暴露在外,哪些應(yīng)該被隱藏,都需要根據(jù)實(shí)際的需求,給與正確的設(shè)計(jì)。
【編輯推薦】
- 分析C#不安全代碼
- 淺析C#調(diào)用ImageAnimator
- C#連接Access、SQL Server數(shù)據(jù)庫(kù)
- 淺談C#固定的和活動(dòng)的變量
- 介紹C#中的值類型
網(wǎng)站標(biāo)題:簡(jiǎn)單介紹C#User類
本文網(wǎng)址:http://m.fisionsoft.com.cn/article/cdidpje.html


咨詢
建站咨詢
