C#之面相對象進階篇

面向?qū)ο蟮奶卣?br>

封裝:行為(方法)和字段(數(shù)據(jù))的結(jié)合

含義:將字段(數(shù)據(jù)成員)和行為(代碼成員)相組合的一種機制。

目的:

1.控制對象狀態(tài)的范圍

2.加強對象自身的內(nèi)聯(lián)(聯(lián)動)性

3.增強對象使用的安全性

封裝圖解:


封裝的基本要求:

特定邊界:所有的內(nèi)部變化都限制在此邊界內(nèi)(類定義的{ });

特定訪問權限:在對象外部不能訪問或修改受保護的內(nèi)部實現(xiàn)細節(jié)(private成員)

有外部接口(方法):此對象利用它與其它對象發(fā)生關聯(lián)(public成員);

屬性和字段結(jié)合實現(xiàn)封裝

屬性的定義:屬性代表了set和get方法

[訪問修飾符 一般為public] ?[new|virtual|override] 屬性類型 屬性名

屬性的作用:快速封裝字段

屬性分類: 讀寫(set+get)、只讀(get)、只寫(set)

使用屬性:

對象引用.屬性=屬性值:自動調(diào)用set方法

對象引用.屬性:自動調(diào)用get方法

屬性實現(xiàn)封裝的好處:快速封裝。


繼承:

面向?qū)ο笾械膬蓚€重要概念:抽象和分類。

抽象和分類是人們認識世界的基本方法:

抽象是將現(xiàn)實世界中客觀存在的事務映射到意識中的一種方法。

分類是指確定這些抽象到意識中的概念之間的關系。

這些關系的基本形式包括一般到特殊和整體與局部。

圖解:


一般到特殊(is a)用繼承(Inheritance)

整體與局部(have a)用組合(composition)

繼承的概念:

? 繼承是由已有的類創(chuàng)建新類的機制。

? 由繼承得到的類稱為子類(派生類)

? 被繼承的類稱為父類(超類)(基類)

繼承的作用:

實現(xiàn)軟件可重用的重要方式

增強軟件可擴充性

提高軟件的可維護性

聲明繼承:

[<修飾符>] class<子類名> :(extends) <基類名>

Object類

C#語言中所有的類都是Object的直接或間接子類

可繼承的內(nèi)容:

子類繼承父類私有以外的成員變量

子類繼承父類私有以外的成員方法

子類不繼承父類的構(gòu)造方法

子類繼承父類的析構(gòu)方法

子類不能刪除父類的成員

子類可以重定義(隱藏\覆蓋)父類成員

子類可以增加自己獨有的成員

子類對象對父類成員的訪問權限:

總結(jié)成一句話就是:

子類可以訪問父類私有成員(private)和構(gòu)造以外的內(nèi)容

注意:受保護(protected)只能在子類內(nèi)訪問

隱藏:

子類中可重定義與父類成員同名的成員

此時父類的成員被隱藏

注意:程序中會出現(xiàn)警告 警告不影響執(zhí)行

消除警告的方法:在隱藏的屬性或方法上追加new關鍵字

base:用來引用(指向)當前對象的父類對象

用法:訪問父類被隱藏的成員變量

如:base.variable;

調(diào)用父類中被覆蓋的方法

如:base.Method([paramlist]);

調(diào)用父類的構(gòu)造函數(shù)

如::base([paramlist]);

注意:base維系了整個繼承關系。

向上轉(zhuǎn)型:子類和父類具有is a的關系。

適用范圍:1:方法參數(shù):用一個方法處理家族對象

2:數(shù)組或集合的類型上:用于存儲家族對象.

例如:父類“人”和子類“學生”:“學生”是“人”。

父類“動物”和子類“貓”:“貓”是“動物”。

因此:父類的引用可以指代子類的實例

動物=兔子

人=學生

以上稱之為:Upcasting\向上轉(zhuǎn)型

向上轉(zhuǎn)型引用訪問范圍受限:

可以訪問子類繼承或覆蓋的成員;

不能訪問子類中新增(獨有)的成員

向上轉(zhuǎn)型對象可以被重新賦值為子類引用

人=學生 ? ? ? ? 學生=(學生)人

這時它又重新可以訪問子類中新增(獨有)成員

作用:

用一個引用處理各種子類對象

便于擴展和維護項目

is和as

父=>子的時候往往會發(fā)生異常

子=(子)父;

原因:無法確認父引用是否經(jīng)過向上轉(zhuǎn)型。

is\as:父類型轉(zhuǎn)換為子類型的安全保障(向上轉(zhuǎn)型的安全保障)。

is:

語法:

對象引用 is 類型

作用:檢測對象引用是否某個類型或其父類型

返回值:true\false

優(yōu)勢:適配所有類型(即使null)

劣勢:效率稍低

as:

語法:

對象引用 as 類型

作用:嘗試轉(zhuǎn)換對象引用為具體類型的引用 (嘗試轉(zhuǎn)換)

返回值:對象引用\null

優(yōu)勢:效率高

劣勢:僅適配引用類型

多態(tài)(polymorphism):即一個名字具有多種語義。在面向?qū)ο笾兄敢粋€方法可以有多種實現(xiàn)版本。

多態(tài): 提高程序的擴展性

類的多態(tài)表現(xiàn)為方法的多態(tài)

方法的多態(tài):重載(overload)和覆蓋(override)。

重載:同一個“類”中方法同名

參數(shù)列表不同:

1.個數(shù)不同

2.類型不同

3.次序不同

注意:返回值類型不同無法確定重載

覆蓋(重寫)

1.父子類中

2.父類的方法virtual修飾一下 形成虛方法或者為抽象方法:abstract修飾

3.子類中的方法務必和父類的方法同名 override關鍵字修飾一下

4.其他的通通一樣(訪問修飾符 修飾符 返回值類型 參數(shù)列表)

多態(tài)分為編譯時多態(tài)和運行時多態(tài)

編譯時多態(tài):

靜態(tài)聯(lián)編(靜態(tài)多態(tài)性)

重載的方法由于參數(shù)列表不同

編譯時就可確定到底執(zhí)行哪個方法的代碼

因此重載又稱編譯時多態(tài)

運行時多態(tài):

動態(tài)聯(lián)編(動態(tài)多態(tài)性)

重寫/覆蓋的方法由于參數(shù)列表相同.

編譯時無法確定到底執(zhí)行哪個(父\子)方法.

運行時依據(jù)內(nèi)存中對象的實際類型確定執(zhí)行哪個(父\子)方法.

因此重寫/覆蓋又稱運行時多態(tài).

調(diào)用原則:“是誰的對象就調(diào)用誰的方法”.

面試題:

重載和覆蓋的區(qū)別:

從方法聲明角度(格式):

重載的兩個函數(shù)參數(shù)列表不同。

覆蓋的兩個方法參數(shù)列表和返回值相同。

從所處位置角度(位置):

重載的兩個方法在同一類中。

覆蓋的兩個方法在有繼承關系的兩個類中。

從方法調(diào)用角度(使用):

重載的方法被同一對象使用不同的參數(shù)調(diào)用。

覆蓋的方法被不同對象使用相同參數(shù)調(diào)用。

從多態(tài)時機角度(特性):

重載的方法在編譯時多態(tài)。

覆蓋的方法在運行時多態(tài)。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 本文出自 Eddy Wiki ,轉(zhuǎn)載請注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 1,272評論 0 5
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,652評論 1 32
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,231評論 8 265
  • 設計模式概述 在學習面向?qū)ο笃叽笤O計原則時需要注意以下幾點:a) 高內(nèi)聚、低耦合和單一職能的“沖突”實際上,這兩者...
    彥幀閱讀 3,888評論 0 14
  • 去歲初春南下路,風雪迷津渡。輾轉(zhuǎn)到天涯,書院燭明,曲徑通幽處。 廬州故地竹林簇,遠近鄉(xiāng)音入。墨海治...
    顧勇詩書閱讀 352評論 0 6

友情鏈接更多精彩內(nèi)容