1:C#中的訪問(wèn)修飾符 public: 公共成員,完全公開(kāi),,沒(méi)有訪問(wèn)限制,。 private: 私有的,只能在當(dāng)前類的內(nèi)部訪問(wèn),。 protected: 受保護(hù)的,,只能在當(dāng)前類的內(nèi)部以及該類的子類中訪問(wèn)。 internal: 只能在當(dāng)前項(xiàng)目中訪問(wèn),,在同一個(gè)項(xiàng)目中,,internal和public的權(quán)限是一樣的。 protected internal: protected + internal權(quán)限,。 1.1:能夠修飾類的訪問(wèn)修飾符只有兩個(gè): public / internal 1.2:接口中的成員不允許添加訪問(wèn)修飾符,,默認(rèn)是public 1.3:類中的成員不添加訪問(wèn)修飾符,默認(rèn)是private 1.4:命名空間的成員不添加訪問(wèn)修飾符,,默認(rèn)是internal 2:繼承(把這幾個(gè)類當(dāng)中重復(fù)的成員單獨(dú)的拿出來(lái)封裝成一個(gè)類,,作為這幾個(gè)類的父類) 我們可能會(huì)有一些類中,寫(xiě)一些重復(fù)的成員,,我們可以將這些重復(fù)的成員,,單獨(dú)的封裝到一個(gè)類中,作為這些類的父類,。 Student Teacher Driver 子類 / 派生類 Person 父類 / 基類 2.1:子類繼承了父類,,子類從父類繼承過(guò)來(lái)什么? 子類繼承了父類的屬性和方法,,但是子類并沒(méi)有繼承父類的私有字段,。 2.2: Q:子類有沒(méi)有繼承父類的構(gòu)造函數(shù)? 答:子類并沒(méi)有繼承父類的構(gòu)造函數(shù),,但是,,子類會(huì)默認(rèn)調(diào)用父類無(wú)參數(shù)的構(gòu)造函數(shù),創(chuàng)建父類對(duì)象,,讓子類可以使用父類的成員,。 解決方案: 1):在父類中重寫(xiě)一個(gè)無(wú)參數(shù)的構(gòu)造函數(shù),。 2):在子類中顯示的調(diào)用父類的構(gòu)造函數(shù),使用關(guān)鍵字:base() 2.3:繼承的特性 1.繼承的單根性: 一個(gè)子類只能有一個(gè)父類 2.繼承的傳遞性: 2.4:查看類圖 2.5:object是所有類的基類 2.6:new關(guān)鍵字 1):創(chuàng)建對(duì)象 2):隱藏從父類那里繼承過(guò)來(lái)的同名成員(子類和父類具有相同名稱的方法) 隱藏的結(jié)果就是:子類調(diào)用不到父類的同名成員,。 2.7:里氏轉(zhuǎn)換 1:子類可以賦值給父類(如果有一個(gè)方法需要一個(gè)父類作為參數(shù),,我們可以傳遞一個(gè)子類對(duì)象)。 2:如果父類中裝的是子類對(duì)象,,則可以將這個(gè)父類強(qiáng)制轉(zhuǎn)換為子類對(duì)象,。 2.7.1:子類對(duì)象可以調(diào)用父類中的成員,但是父類對(duì)象永遠(yuǎn)都只能調(diào)用自己的成員,。 2.8:is 和 as is:表示類型轉(zhuǎn)換,,如果能夠轉(zhuǎn)換成功,則返回一個(gè)true,,否則返回一個(gè)false,。 as:表示類型轉(zhuǎn)換,如果能夠轉(zhuǎn)換則返回對(duì)象的本身,,否則返回一個(gè)null,。 Ps: Q:代碼中出現(xiàn)Error:可訪問(wèn)性不一致的原因 答:子類的訪問(wèn)權(quán)限不能高于父類,會(huì)暴露父類的成員 3:多態(tài) 3.1:實(shí)現(xiàn)多態(tài)的方法: 1):虛方法 將父類的方法標(biāo)記為虛方法,,使用關(guān)鍵字virtual,,這個(gè)函數(shù)可以被子類重新寫(xiě)一遍(override) 2):抽象類 當(dāng)父類中的方法不知道如何去實(shí)現(xiàn)的時(shí)候,可以考慮將父類寫(xiě)成抽象類,,將方法寫(xiě)成抽象方法 3):接口 3.2:抽象類 1.抽象成員必須標(biāo)記為abstract,,并且不能有任何實(shí)現(xiàn)。 2.抽象成員必須在抽象類中,。 3.抽象類不能被實(shí)例化,。 4.子類繼承抽象類后,必須把父類中的所有抽象成員都重寫(xiě),。 (除非子類也是一個(gè)抽象類,,則可以不重寫(xiě)) 5.抽象成員的訪問(wèn)修飾符不能是private 6.在抽象類中可以包含實(shí)例成員。 并且抽象類的實(shí)例成員可以不被子類實(shí)現(xiàn) 7.抽象類是有構(gòu)造函數(shù)的,。雖然不能被實(shí)例化。 8.如果父類的抽象方法中有參數(shù),,那么,。繼承這個(gè)抽象父類的子類在重寫(xiě)父類的方法的時(shí)候必須傳入對(duì)應(yīng)的參數(shù)。 如果抽象父類的抽象方法中有返回值,,那么子類在重寫(xiě)這個(gè)抽象方法的時(shí)候,,也必須要有傳入返回值。 3.3:虛方法/抽象類/接口 何時(shí)用來(lái)實(shí)現(xiàn)多態(tài) 1:如果父類中的方法有默認(rèn)的實(shí)現(xiàn),,并且父類需要被實(shí)例化,,這時(shí)可以考慮將父類定義成一個(gè)普通類,,用虛方法來(lái)實(shí)現(xiàn)多態(tài)。 2:如果父類的方法沒(méi)有默認(rèn)實(shí)現(xiàn),,父類也不需要被實(shí)例化,,則可以將該類定義為抽象類。 3:幾個(gè)對(duì)象沒(méi)有共同的父類,,但是有共同的行為,。則可以使用接口實(shí)現(xiàn) 方法的簽名:方法的返回值和參數(shù) 3.4:虛方法和抽象方法的比較
3.5:靜態(tài)方法和實(shí)例方法(定義和調(diào)用) 3.6:設(shè)計(jì)模式 設(shè)計(jì)這個(gè)項(xiàng)目的一種方式 (簡(jiǎn)單工廠設(shè)計(jì)模式) 3.7:值類型在復(fù)制的時(shí)候,傳遞的是這個(gè)值得本身 引用類型在復(fù)制的時(shí)候,,傳遞的是對(duì)這個(gè)對(duì)象的引用 3.8:序列化與反序列化 序列化:就是將對(duì)象轉(zhuǎn)換為二進(jìn)制 反序列化:就是將二進(jìn)制轉(zhuǎn)換為對(duì)象 作用:傳輸數(shù)據(jù) [Serializable] 只有被Serializable標(biāo)記的類才能被序列化 BinaryFormatter //序列化的類
序列化與發(fā)序列化
3.9:部分類 partial 3.10:密封類 sealed 不能被繼承,, 可以繼承別的普通類 ToString(); 是Object的虛方法,子類可以重寫(xiě)父類的虛方法 3.11:接口 [public] interface I..able { 成員; } 不允許寫(xiě)具有方法體的函數(shù),,不允許有字段,,接口中允許有自動(dòng)屬性 ------------------------------------------------------------------ 接口是一種規(guī)范 1:只要一個(gè)類繼承了一個(gè)接口,這個(gè)類就必須實(shí)現(xiàn)這個(gè)接口中所有的成員 2:接口中的成員不能加"訪問(wèn)修飾符",,接口中的成員訪問(wèn)修飾符為public,,不能修改。 3:接口中只能有方法,,屬性,,索引器,事件,,不能有"字段"和構(gòu)造函數(shù),。 4:接口與接口之間可以繼承,并且可以多繼承,。 5:接口并不能去繼承一個(gè)類,,而類可以繼承接口(接口只能繼承于接口,而類既可以繼承接口,,也可以繼承類) 6:實(shí)現(xiàn)接口的子類必須實(shí)現(xiàn)該接口的全部成員,。 7:一個(gè)類可以同時(shí)繼承一個(gè)類并實(shí)現(xiàn)多個(gè)接口,如果一個(gè)子類同時(shí)繼承了父類A,,并且實(shí)現(xiàn)了接口IA,,那么語(yǔ)法上A必須寫(xiě)在IA的前面。 8:class MyClass:A,IA {} 因?yàn)轭愂菃卫^承的,。 9:顯示實(shí)現(xiàn)接口的目的:解決方法的重名問(wèn)題 什么時(shí)候顯示的去實(shí)現(xiàn)接口:當(dāng)繼承的接口中的方法和參數(shù)一模一樣的時(shí)候,,要使用顯示的接口。 10:當(dāng)一個(gè)抽象類實(shí)現(xiàn)接口的時(shí)候,,需要子類去實(shí)現(xiàn)接口,。 Ps: 面試題:C#中的接口和類有什么異同。 不同點(diǎn): 不能直接實(shí)例化接口,。 接口不包含方法的實(shí)現(xiàn),。 接口可以多繼承,,類只能單繼承。 類定義可在不同的源文件之間進(jìn)行拆分,。 相同點(diǎn): 接口,、類和結(jié)構(gòu)都可以從多個(gè)接口繼承。 接口類似于抽象基類:繼承接口的任何非抽象類型都必須實(shí)現(xiàn)接口的所有成員,。 接口和類都可以包含事件,、索引器、方法和屬性,。 基礎(chǔ)知識(shí):接口只能定義方法(只能定義行為,,不能定義實(shí)現(xiàn)也就是字段),因?yàn)槭录?、索引器,、屬性本質(zhì)上都是方法,所以接口中也可以定義事件,、索引器,、屬性。 Ps:面試題:abstract class和interface有什么區(qū)別? 相同點(diǎn): 都不能被直接實(shí)例化,,都可以通過(guò)繼承實(shí)現(xiàn)其抽象方法,。 不同點(diǎn): 接口支持多繼承;抽象類不能實(shí)現(xiàn)多繼承,。 接口只能定義行為,;抽象類既可以定義行為,還可能提供實(shí)現(xiàn),。 接口只包含方法(Method),、屬性(Property)、索引器(Index),、事件(Event)的簽名,,但不能定義字段和包含實(shí)現(xiàn)的方法; 抽象類可以定義字段,、屬性,、包含有實(shí)現(xiàn)的方法。 接口可以作用于值類型(Struct)和引用類型(Class),;抽象類只能作用于引用類型,。例如,Struct就可以繼承接口,,而不能繼承類。 補(bǔ)充回答:講設(shè)計(jì)模式的時(shí)候SettingsProvider的例子,。
|
|
來(lái)自: 昵稱10504424 > 《工作》