溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C# 面向?qū)ο笕筇卣?的簡(jiǎn)單描述

發(fā)布時(shí)間:2020-06-25 06:45:48 來(lái)源:網(wǎng)絡(luò) 閱讀:900 作者:1351302386 欄目:編程語(yǔ)言

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)的方法


向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI