設(shè)計模式——01面向?qū)ο蠡A(chǔ)

面向?qū)ο缶幊天羲浚琌bject-Oriented Programming
對象是一個自包含的實體,用一組可識別的特性和行為來標(biāo)識除嘹。

類写半,就是具有相同的屬性和功能的對象的抽象的集合

  1. 類的首字母大寫;
  2. 對外公開的方法需要public修飾符尉咕;
  3. 所有類都有構(gòu)造方法叠蝇,如果不編碼則系統(tǒng)默認(rèn)生成空的構(gòu)造方法,如果有定義的構(gòu)造方法龙考,那么默認(rèn)的構(gòu)造方法就會失效了蟆肆。

1. 方法重載

  • 提供了創(chuàng)建同名的多個方法的能力矾睦,但這些方法需使用不同的參數(shù)類型;
  • 方法重載時炎功,兩個方法必須要方法名相同枚冗,但參數(shù)類型或個數(shù)必須要有所不同;
  • 方法重載的意義在于可在不改變原方法的基礎(chǔ)上蛇损,新增功能赁温。

2. 屬性和修飾符

  • 屬性是一個方法或一對方法,但在調(diào)用它的代碼看來淤齐,它是一個字段股囊,即屬性適合于以字段的方法使用方法調(diào)用的場合。
    • 字段是存儲類要滿足其設(shè)計所需要的數(shù)據(jù)更啄,字段是與類相關(guān)的變量稚疹。
  • public表示它所修飾的類成員可以允許其他任何類來訪問,俗稱公有的祭务;
  • private表示只允許同一個類中的成員訪問内狗,俗稱私有的;
  • 如果類中成員沒有加修飾符义锥,則默認(rèn)為private柳沙;
  • 通常字段為private,屬性為public拌倍;
  • 屬性有兩個方法get和set赂鲤;
  • get訪問器返回與聲明的屬性相同的數(shù)據(jù)類型,表示的意思是調(diào)用時可以得到內(nèi)部字段的值或引用柱恤;
  • set訪問器沒有顯示設(shè)置參數(shù)数初,但它又一個隱式參數(shù),用關(guān)鍵字value表示膨更,它的作用是調(diào)用屬性時可以給內(nèi)部的字段或引用復(fù)制妙真;

3. 封裝

每個對象都包含它能進(jìn)行操作所需要的所有信息缴允,這個特性稱為封裝荚守,因此對象不必依賴其他對象來完成自己的操作。

封裝有很多好處

  1. 良好的封裝能夠減少耦合
  2. 類內(nèi)部的實現(xiàn)可以自由地修改
  3. 類具有清晰的對外接口

4.繼承

  • 對象的繼承代表了一種‘is-a'關(guān)系练般,如果兩個對象A和B矗漾,可以描述為B是A,則表明B可以繼承A薄料;
  • 繼承者還可以理解為是對被繼承者的特殊化敞贡,因為它除了具備被繼承者的特性外,還具備自己獨有的個性摄职;
  • 繼承定義了類如何相互關(guān)聯(lián)誊役,共享特性获列。
  • 繼承的工作方式是,定義父類和子類蛔垢,或叫做基類和派生類击孩,其中子類繼承父類的所有特性。子類不但繼承了父類的所有特性鹏漆,還可以定義新的特性巩梢。

如果子類繼承于父類

  • 第一,子類擁有父類非private的屬性和功能艺玲;
  • 第二括蝠,子類具有自己的屬性和功能,即子類可以擴(kuò)展父類沒有的屬性和功能饭聚;
  • 第三忌警、子類還可以以自己的方式實現(xiàn)父類的功能(方法重寫);

protected修飾符表示繼承時子類可以對基類有完全訪問權(quán)秒梳;

子類從它的父類中繼承的成員有方法慨蓝、域、屬性端幼、時間礼烈、索引指示器,但對于構(gòu)造方法婆跑,有一些特殊此熬,它不能被繼承,只能被調(diào)用滑进。
對于調(diào)用父類的成員犀忱,可以用base關(guān)鍵字。

繼承的優(yōu)點和缺點

  • 不用繼承的話扶关,如果要修改功能阴汇,就必須在所有重復(fù)的方法中修改,代碼越多节槐,出錯的可能就越大搀庶,而繼承的優(yōu)點是,繼承使得所有子類公共的部分都放在了父類铜异,使得代碼得到了共享哥倔,這就避免了重復(fù),另外揍庄,繼承可使得修改或擴(kuò)展繼承而來的實現(xiàn)都較為容易咆蒿。
  • 繼承是有缺點的,那就是父類變,則子類不得不變沃测。
    繼承會破壞包裝缭黔,父類實現(xiàn)細(xì)節(jié)暴露給子類,增大了兩個類之間的耦合性蒂破。
    繼承顯示是一種類與類之間強(qiáng)耦合的關(guān)系试浙。
    當(dāng)兩個類之間具備is-a的關(guān)系時,就可以考慮用繼承了寞蚌。

4.多態(tài)

多態(tài)表示不同的對象可以執(zhí)行相同的動作田巴,但要通過他們自己的實現(xiàn)代碼來執(zhí)行。
注意點:

  1. 子類以父類的身份出現(xiàn)挟秤;
  2. 子類在工作時以自己的方式來實現(xiàn)壹哺;
  3. 子類以父類的身份出現(xiàn)時,子類特有的屬性和方法不可以使用艘刚;

5.虛方法和方法重寫

為了使子類的實例完全接替來自父類的類成員管宵,父類必須將該成員聲明為虛擬的。
這是通過在該成員的返回類型之前添加virtual關(guān)鍵字來實現(xiàn)攀甚。
子類可以選擇使用override關(guān)鍵字箩朴,將父類實現(xiàn)替換為它自己的實現(xiàn),這就是方法重寫Override秋度,或者叫做方法覆寫炸庞。

對象的聲明必須是父類,而不是子類荚斯,實例化的對象是子類埠居,這才能實現(xiàn)多態(tài);
多態(tài)的原理是當(dāng)方法被調(diào)用時事期,無論對象是否被轉(zhuǎn)換為其父類滥壕,都只有位于對象繼承鏈最末端的方法實現(xiàn)會被調(diào)用。
也就是說兽泣,虛方法是按照其運行時類型而非編譯時類型進(jìn)行動態(tài)綁定調(diào)用的绎橘。

6.重構(gòu)

抽象類
C#允許把類和方法聲明為abstract,即抽象類和抽象方法唠倦;
抽象方法沒有方法體称鳞,直接在括號后加分號。
抽象類注意點:

  1. 抽象類不能實例化牵敷;
  2. 抽象方法是必須被子類重寫的方法胡岔;
  3. 如果類中包含抽象方法法希,那么類就必須定義為抽象類枷餐,不論是否還包含其他一般方法。

讓抽象類擁有盡可能多的共同代碼苫亦,擁有盡可能少的數(shù)據(jù)毛肋;

抽象類通常代表一個抽象概念怨咪,它提供一個繼承的出發(fā)點,當(dāng)設(shè)計一個新的抽象類時润匙,一定是用來繼承的诗眨,所以,在一個以繼承關(guān)系形成的等級結(jié)構(gòu)里面孕讳,樹葉節(jié)點應(yīng)當(dāng)是具體類匠楚,而樹枝節(jié)點均應(yīng)當(dāng)是抽象類。

7.接口

interface
接口是把隱式公共方法和屬性組合起來厂财,以封裝特定功能的一個集合芋簿。
一旦類實現(xiàn)了接口,類就可以支持接口所指定的所有屬性和成員璃饱;
聲明接口在語法上與聲明抽象類完全相同与斤,但不允許提供接口中任何成員的執(zhí)行方式;
實現(xiàn)接口的類就必須要實現(xiàn)接口中的所有方法和屬性荚恶。

一個類可以支持多個接口撩穿,多個類也可以支持相同的接口;
接口的命名谒撼,前面要加大寫字母I食寡;
接口用interface生命,接口中的方法或?qū)傩郧懊娌荒苡行揎椃薄⒎椒]有方法體冻河。

抽象類和接口的區(qū)別

從表象上來說:

  • 抽象類可以給出一些成員的實現(xiàn),接口卻不包含成員的實現(xiàn)茉帅;
  • 抽象類的抽象成員可被子類部分實現(xiàn)叨叙,接口的成員需要實現(xiàn)類完全實現(xiàn);
  • 一個類只能拿繼承一個抽象類堪澎,但可實現(xiàn)多個接口等等擂错;

用三點來區(qū)分抽象類接口

  1. 類是對對象的抽象;抽象類是對類的抽象樱蛤;接口是對行為的抽象钮呀;
  2. 如果行為跨越不同類的對象,可使用接口昨凡;對于一些相似的類對象爽醋,用繼承抽象類;
  3. 從設(shè)計的角度講便脊,抽象類是從子類中發(fā)現(xiàn)了公共的東西蚂四,泛化出父類,然后子類繼承父類,而接口是根本不知子類的存在遂赠,方法如何實現(xiàn)還不確認(rèn)久妆,預(yù)先定義。

8.集合

數(shù)組
優(yōu)點:比如說數(shù)組在內(nèi)存中連續(xù)存儲跷睦,因此可以快速而容易地從頭到尾遍歷元素筷弦,可以快速修改元素等等;
缺點:是創(chuàng)建時必須要制定數(shù)組變量的大小抑诸,還有在兩個元素之間添加元素也比較困難烂琴。

  • .NET Framework提供了用于數(shù)據(jù)存儲和檢索的專用類,這些類統(tǒng)稱集合蜕乡;
  • 這些類提供對堆棧监右、隊列、列表和哈希表的支持异希;
  • 大多數(shù)集合類實現(xiàn)相同的接口健盒。

ArrayList

  • 它是命名空間System.Collection下的一部分,它是使用大小可按需動態(tài)增加的數(shù)組實現(xiàn)IList接口称簿;
  • ArrayList的容量是ArrayList可以保存的元素數(shù)扣癣;
  • 默認(rèn)出事容量為0,隨著元素添加到ArrayList中憨降,容量會根據(jù)需要通過重新分配自動增加父虑;
  • 使用整數(shù)索引可以訪問此集合中的元素,索引從零開始授药;
  • 缺點士嚎,ArrayList不是類型安全的,裝箱拆箱會帶來很大的性能損耗悔叽;

裝箱&拆箱
裝箱就是把值類型打包到Object引用類型的一個實例中莱衩;
拆箱就是指從對象中提取值類型;
相對于簡單的賦值而言娇澎,裝箱和拆箱過程需要進(jìn)行大量的計算笨蚁。對值類型進(jìn)行裝箱時,必須分配并構(gòu)造一個全新的對象趟庄。
其次括细,拆箱所需的強(qiáng)制轉(zhuǎn)換也需要進(jìn)行大量的計算。

9.泛型

  • 泛型是具有占位符(類型參數(shù))的類戚啥、結(jié)構(gòu)奋单、接口和方法,這些占位符是類猫十、結(jié)構(gòu)览濒、接口和方法所存儲或使用的一個或多個類型的占位符呆盖。
  • 泛型集合類可以將類型參數(shù)用作它所存儲的對象的類型的占位符;
  • 類型參數(shù)作為其字段的類型和其方法的參數(shù)類型出現(xiàn)匾七;

泛型集合需要System.Collections.Generic的命名空間絮短;
List類是ArrayList類的泛型等效類江兢;

  • 通常情況下昨忆,都建議使用泛型集合,因為這樣可以獲得類型安全的直接優(yōu)點而不需要從基集合類型派生并實現(xiàn)類型特定的成員杉允。
  • 此外邑贴,如果集合元素為值類型,泛型集合類型的性能通常優(yōu)于對應(yīng)的非泛型集合類型(并優(yōu)于從非泛型基集合類型派生的類型)叔磷,因為使用泛型時不必對元素進(jìn)行裝箱拢驾。

10.委托和事件

  • 委托是對函數(shù)的封裝,可以當(dāng)作給方法的特征指定一個名稱改基。
  • 而事件則是委托的一種特殊形式繁疤,當(dāng)發(fā)生有意義的事情時,事件對象處理通知過程秕狰。
  • 委托是一種引用方法的類型稠腊,一旦為委托分配了方法,委托將與該方法具有完全相同的行為鸣哀。
  • 事件是說在發(fā)生其他類或?qū)ο箨P(guān)注的事情時架忌,類或?qū)ο罂赏ㄟ^事件通知他們;
  • 委托對象用關(guān)鍵字delegate來聲明我衬,事件對象用event關(guān)鍵字聲明叹放。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市挠羔,隨后出現(xiàn)的幾起案子井仰,更是在濱河造成了極大的恐慌,老刑警劉巖破加,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糕档,死亡現(xiàn)場離奇詭異,居然都是意外死亡拌喉,警方通過查閱死者的電腦和手機(jī)速那,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尿背,“玉大人端仰,你說我怎么就攤上這事√锩辏” “怎么了荔烧?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵吱七,是天一觀的道長。 經(jīng)常有香客問我鹤竭,道長踊餐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任臀稚,我火速辦了婚禮吝岭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吧寺。我一直安慰自己窜管,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布稚机。 她就那樣靜靜地躺著幕帆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赖条。 梳的紋絲不亂的頭發(fā)上失乾,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機(jī)與錄音纬乍,去河邊找鬼碱茁。 笑死,一個胖子當(dāng)著我的面吹牛蕾额,可吹牛的內(nèi)容都是我干的早芭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼诅蝶,長吁一口氣:“原來是場噩夢啊……” “哼退个!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起调炬,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤语盈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后缰泡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刀荒,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年棘钞,在試婚紗的時候發(fā)現(xiàn)自己被綠了缠借。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡宜猜,死狀恐怖泼返,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姨拥,我是刑警寧澤绅喉,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布渠鸽,位于F島的核電站,受9級特大地震影響柴罐,放射性物質(zhì)發(fā)生泄漏徽缚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一革屠、第九天 我趴在偏房一處隱蔽的房頂上張望凿试。 院中可真熱鬧,春花似錦屠阻、人聲如沸红省。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至虾啦,卻和暖如春麻诀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背傲醉。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工蝇闭, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人硬毕。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓呻引,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吐咳。 傳聞我的和親對象是個殘疾皇子逻悠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容