訪問修飾符
字段、方法都可以叫做類的成員Member,它們都需要定義訪問級(jí)別。
訪問級(jí)別的用處在于控制成員在哪些地方可以被訪問。
訪問修飾符:public/private/internal/protected
private : 私有成員, 在類的內(nèi)部才可以訪問。
public : 公共成員,完全公開,沒有訪問限制。
protected : 保護(hù)成員,該類內(nèi)部和繼承類中可以訪問。
internal: 當(dāng)前程序集內(nèi)可以訪問。程序集:exe\dll中
internal protected:internal 和 protected的并集, 同一個(gè)程序集中的所有類,以及所有程序集中的子類。
修飾符可以修飾的內(nèi)容:
類(class)和結(jié)構(gòu)(struct)只能用public, internal來修飾
成員(屬性、方法)能用以上5種來修飾
默認(rèn)沒有訪問修飾符的默認(rèn)規(guī)則:
類中字段和方法默認(rèn)的訪問修飾符是private
類(class)和結(jié)構(gòu)(struct)默認(rèn)的訪問修飾符是internal
注:程序集(Assembly)-一般指一個(gè)Exe可執(zhí)行文件或類庫(DLL文件)
封裝:
行為(方法)和字段(數(shù)據(jù))的結(jié)合
含義:將字段(數(shù)據(jù)成員)和行為(代碼成員)相組合的一種機(jī)制。
目的:
1.控制對(duì)象狀態(tài)的范圍
2.加強(qiáng)對(duì)象自身的內(nèi)聯(lián)(聯(lián)動(dòng))性
3.增強(qiáng)對(duì)象使用的安全性
封裝的基本要求:
特定邊界:所有的內(nèi)部變化都限制在此邊界內(nèi)(類定義的{ });
特定訪問權(quán)限:在對(duì)象外部不能訪問或修改受保護(hù)的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)(private成員)
有外部接口(方法):此對(duì)象利用它與其它對(duì)象發(fā)生關(guān)聯(lián)(public成員);
例:銀行的取錢方案等
屬性:
屬性和字段結(jié)合實(shí)現(xiàn)封裝
屬性的定義:屬性代表了set和get方法
[訪問修飾符 一般為public] ?[new|virtual|override] 屬性類型 屬性名
{
get
{
// 返回屬性對(duì)應(yīng)的字段的值
}
set
{
// 設(shè)定屬性對(duì)應(yīng)的字段的值,參數(shù)值由隱參value接收
// 自動(dòng)執(zhí)行:value=傳入的參數(shù)值
}
}
屬性的作用:快速封裝字段
屬性分類: 讀寫(set+get)、只讀(get)、只寫(set)
使用屬性:
對(duì)象引用.屬性=屬性值:自動(dòng)調(diào)用set方法
對(duì)象引用.屬性:自動(dòng)調(diào)用get方法
繼承:
面向?qū)ο笾械膬蓚€(gè)重要概念:
抽象和分類:
抽象和分類是人們認(rèn)識(shí)世界的基本方法:
抽象是將現(xiàn)實(shí)世界中客觀存在的事務(wù)映射到意識(shí)中的一種方法。
分類是指確定這些抽象到意識(shí)中的概念之間的關(guān)系。
這些關(guān)系的基本形式包括一般到特殊和整體與局部。
一般到特殊(is a)用繼承(Inheritance)
整體與局部(have a)用組合(composition)
繼承的概念
繼承是由已有的類創(chuàng)建新類的機(jī)制。
由繼承得到的類稱為子類(派生類)
被繼承的類稱為父類(超類)(基類)
繼承的作用:
實(shí)現(xiàn)軟件可重用的重要方式
增強(qiáng)軟件可擴(kuò)充性
提高軟件的可維護(hù)性
聲明繼承
[<修飾符>] class<子類名> :(extends) <基類名>
Object類
C#語言中所有的類都是Object的直接或間接子類
可繼承的內(nèi)容:
子類繼承父類私有以外的成員變量
子類繼承父類私有以外的成員方法
子類繼承父類的析構(gòu)方法
子類可以重定義(隱藏\覆蓋)父類成員
子類可以增加自己獨(dú)有的成員
子類不能刪除父類的成員
子類不繼承父類的構(gòu)造方法
子類對(duì)象對(duì)父類成員的訪問權(quán)限:
子類可以訪問父類私有成員(private)以外的內(nèi)容
注意:受保護(hù)(protected)只能在子類內(nèi)訪問
子類中可重定義與父類成員同名的成員
此時(shí)父類的成員被隱藏
注意:
程序中會(huì)出現(xiàn)警告 警告不影響執(zhí)行
消除警告的方法:
在隱藏的屬性或方法上追加new關(guān)鍵字
base:
用來引用(指向)當(dāng)前對(duì)象的父類對(duì)象
用法:
訪問父類被隱藏的成員變量
如:
???base.variable;
調(diào)用父類中被覆蓋的方法
如:
???base.Method([paramlist]);
調(diào)用父類的構(gòu)造函數(shù)
如:
???:base([paramlist]);
注意:base維系了整個(gè)繼承關(guān)系
向上轉(zhuǎn)型
子類和父類具有is a的關(guān)系
例如:
父類“人”和子類“學(xué)生”:“學(xué)生”是“人”
父類“動(dòng)物”和子類“貓”:“貓”是“動(dòng)物”
因此:
父類的引用可以指代子類的實(shí)例
動(dòng)物=兔子
人=學(xué)生
以上稱之為:Upcasting\向上轉(zhuǎn)型
上轉(zhuǎn)型引用訪問范圍受限:
可以訪問子類繼承或覆蓋的成員;
不能訪問子類中新增(獨(dú)有)的成員
上轉(zhuǎn)型對(duì)象可以被重新賦值為子類引用
人=學(xué)生
學(xué)生=(學(xué)生)人
這時(shí)它又重新可以訪問子類中新增(獨(dú)有)成員
作用:
用一個(gè)引用處理各種子類對(duì)象
便于擴(kuò)展和維護(hù)項(xiàng)目
is 和 as
父=>子的時(shí)候往往會(huì)發(fā)生異常
子=(子)父;
原因:無法確認(rèn)父引用是否經(jīng)過向上轉(zhuǎn)型
is\as:父類型轉(zhuǎn)換為子類型的安全保障
is:
語法:
對(duì)象引用 is 類型
作用:檢測對(duì)象引用是否某個(gè)類型或其父類型
返回值:true\false
優(yōu)勢:適配所有類型(即使null)
劣勢:效率稍低
as:
語法:
對(duì)象引用 as 類型
作用:嘗試轉(zhuǎn)換對(duì)象引用為具體類型的引用
返回值:對(duì)象引用\null
優(yōu)勢:效率高
劣勢:僅適配引用類型
多態(tài):
提高程序的擴(kuò)展性
多態(tài)(polymorphism):
即一個(gè)名字具有多種語義。
在面向?qū)ο笾兄敢粋€(gè)方法可以有多種實(shí)現(xiàn)版本。
類的多態(tài)表現(xiàn)為方法的多態(tài)
方法的多態(tài):
重載(overload)和覆蓋(override)。
重載:
同一個(gè)“類”中
方法同名
參數(shù)列表不同:
1.個(gè)數(shù)不同
2.類型不同
3.次序不同
注意:返回值類型不同無法確定重載
覆蓋(重寫)
1.父子類中
2.父類的方法virtual修飾一下 形成虛方法
或者為抽象方法:abstract修飾
3.子類中的方法務(wù)必和父類的方法同名
override關(guān)鍵字修飾一下
4.其他的通通一樣(訪問修飾符 修飾符 返回值類型 參數(shù)列表)
靜態(tài)聯(lián)編(靜態(tài)多態(tài)性)
重載的方法由于參數(shù)列表不同
編譯時(shí)就可確定到底執(zhí)行哪個(gè)方法的代碼
因此重載又稱編譯時(shí)多態(tài)
動(dòng)態(tài)聯(lián)編(動(dòng)態(tài)多態(tài)性)
重寫/覆蓋的方法由于參數(shù)列表相同
編譯時(shí)無法確定到底執(zhí)行哪個(gè)(父\子)方法
運(yùn)行時(shí)依據(jù)內(nèi)存中對(duì)象的實(shí)際類型確定執(zhí)行哪個(gè)(父\子)方法
因此重寫/覆蓋又稱運(yùn)行時(shí)多態(tài)
調(diào)用原則:“是誰的對(duì)象就調(diào)用誰的方法”
從方法聲明角度(格式):
重載的兩個(gè)函數(shù)參數(shù)列表不同
覆蓋的兩個(gè)方法參數(shù)列表和返回值相同
從所處位置角度(位置):
重載的兩個(gè)方法在同一類中
覆蓋的兩個(gè)方法在有繼承關(guān)系的兩個(gè)類中
從方法調(diào)用角度(使用):
重載的方法被同一對(duì)象使用不同的參數(shù)調(diào)用
覆蓋的方法被不同對(duì)象使用相同參數(shù)調(diào)用
從多態(tài)時(shí)機(jī)角度(特性):
重載的方法在編譯時(shí)多態(tài)
覆蓋的方法在運(yùn)行時(shí)多態(tài)