面向?qū)ο缶幊天羲浚琌bject-Oriented Programming
對象是一個自包含的實體,用一組可識別的特性和行為來標(biāo)識除嘹。
類写半,就是具有相同的屬性和功能的對象的抽象的集合
- 類的首字母大寫;
- 對外公開的方法需要public修飾符尉咕;
- 所有類都有構(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)行操作所需要的所有信息缴允,這個特性稱為封裝荚守,因此對象不必依賴其他對象來完成自己的操作。
封裝有很多好處
- 良好的封裝能夠減少耦合
- 類內(nèi)部的實現(xiàn)可以自由地修改
- 類具有清晰的對外接口
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í)行。
注意點:
- 子類以父類的身份出現(xiàn)挟秤;
- 子類在工作時以自己的方式來實現(xiàn)壹哺;
- 子類以父類的身份出現(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,即抽象類和抽象方法唠倦;
抽象方法沒有方法體称鳞,直接在括號后加分號。
抽象類注意點:
- 抽象類不能實例化牵敷;
- 抽象方法是必須被子類重寫的方法胡岔;
- 如果類中包含抽象方法法希,那么類就必須定義為抽象類枷餐,不論是否還包含其他一般方法。
讓抽象類擁有盡可能多的共同代碼苫亦,擁有盡可能少的數(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ū)分抽象類接口
- 類是對對象的抽象;抽象類是對類的抽象樱蛤;接口是對行為的抽象钮呀;
- 如果行為跨越不同類的對象,可使用接口昨凡;對于一些相似的類對象爽醋,用繼承抽象類;
- 從設(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)鍵字聲明叹放。