C#面向?qū)ο蟮娜筇卣鳎?/p>
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:申請域名、雅安服務(wù)器托管、營銷軟件、網(wǎng)站建設(shè)、張家川回族自治網(wǎng)站維護(hù)、網(wǎng)站推廣。封裝、繼承、多態(tài)
封裝:
保證對象自身數(shù)據(jù)的完整性和安全性
1.完整性:封裝就是把一些散的代碼包裝起來,讓他們共同去完成一個功能
如:類、屬性、方法都是封裝的一種形式
2.安全性:如:我們在創(chuàng)建一個對象或調(diào)用一個方法時,只需要實例化一個類對象
或調(diào)用一個方法名就可以完成我們需要的功能,而他內(nèi)部是怎么實現(xiàn)的,我們無法看到
繼承:
C#繼承的語法:
public class 子類:父類
{
//繼承使用 : 符號
}
概念:
建立類之間的關(guān)系(父類與子類),實現(xiàn)代碼復(fù)用,方便系統(tǒng)的擴(kuò)展
1.在繼承中分為父類(基類)和子類(派生類),也就是說當(dāng)子類繼承了父類以后,
那么子類就擁有了父類中非private的成員(屬性、方法等)
例子:
學(xué)生類 有姓名、年齡...
員工類 有姓名、年齡...
那么如果這個時候,我們還要添加男人類、女人類等,
那是不是又要去寫姓名 和 年齡等這些屬性...這樣就會很麻煩
然而 學(xué)生類和員工類 他們都共有 姓名、年齡這兩個屬性
之所以,他們都有這兩個屬性是因為他們都屬于人類
所以這個時候我們就可以把他們共有的屬性等提取出來共同封裝
在一個Person類中,然后讓學(xué)生類和員工類都繼承Person類
這樣,學(xué)生類和員工類就都擁有了姓名和年齡這兩個屬性,
他們共有的屬性、方法就交給了Person類來管理,而他們只需要管理
自己特有的屬性、方法就可以了
這樣做的好處就是實現(xiàn)了代碼的復(fù)用,方便了系統(tǒng)的擴(kuò)展,
如:
以后我們還要再添加一個男人類或者女人類等,
就不用再去寫姓名、年齡等這些他們共有的成員了,只需要繼承Person類就可以了,
同樣,如果要添加一個他們共有的成員時,只需要在父類Person中添加就可以了
而不必去在他們每個類中都去添加新增的成員。
例子:
public class Person //人類(這里他是父類)
{
public string Name{get;set;} //姓名
public int Age{get;set;} //年齡
}
public class Student:Person //學(xué)生類 繼承 人類
{
//當(dāng)Student繼承了Person后,Student就自動擁有了Person類的非private成員
}
public class Employee:Person //員工類 繼承 人類
{
//當(dāng)Employee繼承了Person后,Employee就自動擁有了Person類的非private成員
}
當(dāng)我們創(chuàng)建一個Student對象和Employee對象時:
Student stu = new Student();
Employee emp = new Employee();
就可以使用:
stu.Name="張三";
stu.Age = 20;
emp.Name = "李四";
emp.Age = 30;
這就是因為他們都繼承了Person類的原因
2.繼承要符合 "子類 is a 父類" 的關(guān)系,就是說 子類是一個父類
例子:同上面所說,要想實現(xiàn)繼承,就必須要符合 子類 is a 父類的關(guān)系,
如:學(xué)生是一個人,學(xué)生 is a 人 員工是一個人 員工 is a 人
3.繼承的單根性,在C#中一個子類只能繼承一個父類(就像一個兒子不能擁有多個父親一樣)
4.子類可以替換父類并且出現(xiàn)在父類能夠出現(xiàn)的任何地方,且程序的行為不會發(fā)生變化,但是
反過來,父類對象不能替換子類對象,這種特性被稱作 "里氏替換原則(Liskor Subsitution Principle)"
例子:
上面的例子創(chuàng)建對象也可以這樣寫:
Person p1 = new Student();
Person p2 = new Employee(); //里氏替換原則
而下面這樣寫就會報錯:
Student stu = new Person();
Employee emp = new Person(); //報錯
里氏替換原則中可以使用 is 和 as 操作符
is:用于去判斷一個類型是否是給定的類型,返回bool值
如:p1 is Student //判斷p1是否是Student類型 true:是 false:不是
as:用于把一個類型轉(zhuǎn)換為另一個類型,類似于強(qiáng)制轉(zhuǎn)換,但是在強(qiáng)制轉(zhuǎn)換中,
如果給定的轉(zhuǎn)換類型不兼容(轉(zhuǎn)換失?。?,則會報錯,但是 as 轉(zhuǎn)換失敗的話,
不會報錯,會返回null
如:p1 as Student //把p1轉(zhuǎn)換為Student類型,如果失敗返回null
多態(tài):
概念:多態(tài)是指兩個或多個屬于不同類的對象,對于同一個消息(方法調(diào)用)
作出不同響應(yīng)的方式。
實現(xiàn)多態(tài)的方式:
1.重載
2.虛方法
3.抽象方法(還有抽象屬性) → 抽象的成員沒有主體
4.泛型如:
定義虛方法語法:
訪問修飾符 virtual 返回類型 方法名()
{
//方法體
//注意:虛方法不能是private
}
定義抽象方法語法:
訪問修飾符 abstract 返回類型 方法名(); //沒有方法體、不能是privatte
定義抽象屬性語法:
public abstract 數(shù)據(jù)類型 屬性名
{
get;set; //不能帶有字段
}
子類中重寫虛方法和抽象方法語法:
訪問修飾符 override 返回類型 方法名()
{
//方法體
//注意:子類中重寫父類的方法必須要:返回類型、方法名、參數(shù)都一樣
}
子類中重寫抽象屬性例子:
public override int Age
{
get{return age;}
set{age = value;}
}
虛方法 和 抽象方法 區(qū)別:
虛方法:
1.用virtual修飾
2.要有方法體
3.可以被子類override(重寫)
4.除了密封類、靜態(tài)類外都可以寫(虛方法)
抽象方法:
1.用abstract修飾
2.沒有方法體
3.必須被非抽象的子類override(重寫)
4.必須存在于抽象類中
抽象類:
1.有抽象方法(屬性)的類一定是抽象類
2.抽象類不僅可以包含抽象方法、抽象屬性,同樣也可以包含其他屬性、方法和構(gòu)造函數(shù)
3.抽象類不能被實例化
4.抽象類不能是靜態(tài)或者密封的,因為靜態(tài)類和密封類都不能被繼承
例子:
public abstract class Person //抽象類 Person 為父類
{
//定義了一個抽象方法
public abstract string Test();
}
public class Employee:Person //繼承了Person類
{
//由于Employee類不是抽象類,所以必須重寫override父類Person的Test()方法
public override string Test()
{
//方法體
return ""; //override 必須要方法名、參數(shù)、返回類型都相同
}
}
記住:抽象類不能被實例化
Person p = new Person(); //這樣寫會報錯
但是,可以這樣寫:
Person p = new Employee(); //這樣寫是正確的
那么調(diào)用p.Test() 方法 會執(zhí)行Employee里面的Test()方法,
也就是說,父類的方法一旦被子類重寫override以后,那么創(chuàng)建
的父類對象就會去調(diào)用它實際類型對象的方法(就是被重寫后的方法)
PS:抽象成員必須被非抽象子類override重寫
當(dāng)然,如果是虛方法的話,在子類中沒有被重寫,那么就會調(diào)用父類的方法
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。