您好,登錄后才能下訂單哦!
C#面向?qū)ο蟮娜筇卣鳎?/p>
封裝、繼承、多態(tài)
封裝:
保證對(duì)象自身數(shù)據(jù)的完整性和安全性
1.完整性:封裝就是把一些散的代碼包裝起來(lái),讓他們共同去完成一個(gè)功能
如:類(lèi)、屬性、方法都是封裝的一種形式
2.安全性:如:我們?cè)趧?chuàng)建一個(gè)對(duì)象或調(diào)用一個(gè)方法時(shí),只需要實(shí)例化一個(gè)類(lèi)對(duì)象
或調(diào)用一個(gè)方法名就可以完成我們需要的功能,而他內(nèi)部是怎么實(shí)現(xiàn)的,我們無(wú)法看到
繼承:
C#繼承的語(yǔ)法:
public class 子類(lèi):父類(lèi)
{
//繼承使用 : 符號(hào)
}
概念:
建立類(lèi)之間的關(guān)系(父類(lèi)與子類(lèi)),實(shí)現(xiàn)代碼復(fù)用,方便系統(tǒng)的擴(kuò)展
1.在繼承中分為父類(lèi)(基類(lèi))和子類(lèi)(派生類(lèi)),也就是說(shuō)當(dāng)子類(lèi)繼承了父類(lèi)以后,
那么子類(lèi)就擁有了父類(lèi)中非private的成員(屬性、方法等)
例子:
學(xué)生類(lèi) 有姓名、年齡...
員工類(lèi) 有姓名、年齡...
那么如果這個(gè)時(shí)候,我們還要添加男人類(lèi)、女人類(lèi)等,
那是不是又要去寫(xiě)姓名 和 年齡等這些屬性...這樣就會(huì)很麻煩
然而 學(xué)生類(lèi)和員工類(lèi) 他們都共有 姓名、年齡這兩個(gè)屬性
之所以,他們都有這兩個(gè)屬性是因?yàn)樗麄兌紝儆谌祟?lèi)
所以這個(gè)時(shí)候我們就可以把他們共有的屬性等提取出來(lái)共同封裝
在一個(gè)Person類(lèi)中,然后讓學(xué)生類(lèi)和員工類(lèi)都繼承Person類(lèi)
這樣,學(xué)生類(lèi)和員工類(lèi)就都擁有了姓名和年齡這兩個(gè)屬性,
他們共有的屬性、方法就交給了Person類(lèi)來(lái)管理,而他們只需要管理
自己特有的屬性、方法就可以了
這樣做的好處就是實(shí)現(xiàn)了代碼的復(fù)用,方便了系統(tǒng)的擴(kuò)展,
如:
以后我們還要再添加一個(gè)男人類(lèi)或者女人類(lèi)等,
就不用再去寫(xiě)姓名、年齡等這些他們共有的成員了,只需要繼承Person類(lèi)就可以了,
同樣,如果要添加一個(gè)他們共有的成員時(shí),只需要在父類(lèi)Person中添加就可以了
而不必去在他們每個(gè)類(lèi)中都去添加新增的成員。
例子:
public class Person //人類(lèi)(這里他是父類(lèi))
{
public string Name{get;set;} //姓名
public int Age{get;set;} //年齡
}
public class Student:Person //學(xué)生類(lèi) 繼承 人類(lèi)
{
//當(dāng)Student繼承了Person后,Student就自動(dòng)擁有了Person類(lèi)的非private成員
}
public class Employee:Person //員工類(lèi) 繼承 人類(lèi)
{
//當(dāng)Employee繼承了Person后,Employee就自動(dòng)擁有了Person類(lèi)的非private成員
}
當(dāng)我們創(chuàng)建一個(gè)Student對(duì)象和Employee對(duì)象時(shí):
Student stu = new Student();
Employee emp = new Employee();
就可以使用:
stu.Name="張三";
stu.Age = 20;
emp.Name = "李四";
emp.Age = 30;
這就是因?yàn)樗麄兌祭^承了Person類(lèi)的原因
2.繼承要符合 "子類(lèi) is a 父類(lèi)" 的關(guān)系,就是說(shuō) 子類(lèi)是一個(gè)父類(lèi)
例子:同上面所說(shuō),要想實(shí)現(xiàn)繼承,就必須要符合 子類(lèi) is a 父類(lèi)的關(guān)系,
如:學(xué)生是一個(gè)人,學(xué)生 is a 人 員工是一個(gè)人 員工 is a 人
3.繼承的單根性,在C#中一個(gè)子類(lèi)只能繼承一個(gè)父類(lèi)(就像一個(gè)兒子不能擁有多個(gè)父親一樣)
4.子類(lèi)可以替換父類(lèi)并且出現(xiàn)在父類(lèi)能夠出現(xiàn)的任何地方,且程序的行為不會(huì)發(fā)生變化,但是
反過(guò)來(lái),父類(lèi)對(duì)象不能替換子類(lèi)對(duì)象,這種特性被稱(chēng)作 "里氏替換原則(Liskor Subsitution Principle)"
例子:
上面的例子創(chuàng)建對(duì)象也可以這樣寫(xiě):
Person p1 = new Student();
Person p2 = new Employee(); //里氏替換原則
而下面這樣寫(xiě)就會(huì)報(bào)錯(cuò):
Student stu = new Person();
Employee emp = new Person(); //報(bào)錯(cuò)
里氏替換原則中可以使用 is 和 as 操作符
is:用于去判斷一個(gè)類(lèi)型是否是給定的類(lèi)型,返回bool值
如:p1 is Student //判斷p1是否是Student類(lèi)型 true:是 false:不是
as:用于把一個(gè)類(lèi)型轉(zhuǎn)換為另一個(gè)類(lèi)型,類(lèi)似于強(qiáng)制轉(zhuǎn)換,但是在強(qiáng)制轉(zhuǎn)換中,
如果給定的轉(zhuǎn)換類(lèi)型不兼容(轉(zhuǎn)換失?。瑒t會(huì)報(bào)錯(cuò),但是 as 轉(zhuǎn)換失敗的話,
不會(huì)報(bào)錯(cuò),會(huì)返回null
如:p1 as Student //把p1轉(zhuǎn)換為Student類(lèi)型,如果失敗返回null
多態(tài):
概念:多態(tài)是指兩個(gè)或多個(gè)屬于不同類(lèi)的對(duì)象,對(duì)于同一個(gè)消息(方法調(diào)用)
作出不同響應(yīng)的方式。
實(shí)現(xiàn)多態(tài)的方式:
1.重載
2.虛方法
3.抽象方法(還有抽象屬性) → 抽象的成員沒(méi)有主體
4.泛型如:<T>
定義虛方法語(yǔ)法:
訪問(wèn)修飾符 virtual 返回類(lèi)型 方法名()
{
//方法體
//注意:虛方法不能是private
}
定義抽象方法語(yǔ)法:
訪問(wèn)修飾符 abstract 返回類(lèi)型 方法名(); //沒(méi)有方法體、不能是privatte
定義抽象屬性語(yǔ)法:
public abstract 數(shù)據(jù)類(lèi)型 屬性名
{
get;set; //不能帶有字段
}
子類(lèi)中重寫(xiě)虛方法和抽象方法語(yǔ)法:
訪問(wèn)修飾符 override 返回類(lèi)型 方法名()
{
//方法體
//注意:子類(lèi)中重寫(xiě)父類(lèi)的方法必須要:返回類(lèi)型、方法名、參數(shù)都一樣
}
子類(lèi)中重寫(xiě)抽象屬性例子:
public override int Age
{
get{return age;}
set{age = value;}
}
虛方法 和 抽象方法 區(qū)別:
虛方法:
1.用virtual修飾
2.要有方法體
3.可以被子類(lèi)override(重寫(xiě))
4.除了密封類(lèi)、靜態(tài)類(lèi)外都可以寫(xiě)(虛方法)
抽象方法:
1.用abstract修飾
2.沒(méi)有方法體
3.必須被非抽象的子類(lèi)override(重寫(xiě))
4.必須存在于抽象類(lèi)中
抽象類(lèi):
1.有抽象方法(屬性)的類(lèi)一定是抽象類(lèi)
2.抽象類(lèi)不僅可以包含抽象方法、抽象屬性,同樣也可以包含其他屬性、方法和構(gòu)造函數(shù)
3.抽象類(lèi)不能被實(shí)例化
4.抽象類(lèi)不能是靜態(tài)或者密封的,因?yàn)殪o態(tài)類(lèi)和密封類(lèi)都不能被繼承
例子:
public abstract class Person //抽象類(lèi) Person 為父類(lèi)
{
//定義了一個(gè)抽象方法
public abstract string Test();
}
public class Employee:Person //繼承了Person類(lèi)
{
//由于Employee類(lèi)不是抽象類(lèi),所以必須重寫(xiě)override父類(lèi)Person的Test()方法
public override string Test()
{
//方法體
return ""; //override 必須要方法名、參數(shù)、返回類(lèi)型都相同
}
}
記?。撼橄箢?lèi)不能被實(shí)例化
Person p = new Person(); //這樣寫(xiě)會(huì)報(bào)錯(cuò)
但是,可以這樣寫(xiě):
Person p = new Employee(); //這樣寫(xiě)是正確的
那么調(diào)用p.Test() 方法 會(huì)執(zhí)行Employee里面的Test()方法,
也就是說(shuō),父類(lèi)的方法一旦被子類(lèi)重寫(xiě)override以后,那么創(chuàng)建
的父類(lèi)對(duì)象就會(huì)去調(diào)用它實(shí)際類(lèi)型對(duì)象的方法(就是被重寫(xiě)后的方法)
PS:抽象成員必須被非抽象子類(lèi)override重寫(xiě)
當(dāng)然,如果是虛方法的話,在子類(lèi)中沒(méi)有被重寫(xiě),那么就會(huì)調(diào)用父類(lèi)的方法
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。