溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C# 面向對象三大特征 的簡單描述

發布時間:2020-06-25 06:45:48 來源:網絡 閱讀:936 作者:1351302386 欄目:編程語言

C#面向對象的三大特征:

封裝、繼承、多態

封裝:

保證對象自身數據的完整性和安全性

1.完整性:封裝就是把一些散的代碼包裝起來,讓他們共同去完成一個功能

 如:類、屬性、方法都是封裝的一種形式

2.安全性:如:我們在創建一個對象或調用一個方法時,只需要實例化一個類對象

 或調用一個方法名就可以完成我們需要的功能,而他內部是怎么實現的,我們無法看到

繼承:

C#繼承的語法:

public class 子類:父類

{

//繼承使用 : 符號

}

概念:

建立類之間的關系(父類與子類),實現代碼復用,方便系統的擴展

1.在繼承中分為父類(基類)和子類(派生類),也就是說當子類繼承了父類以后,

 那么子類就擁有了父類中非private的成員(屬性、方法等)

例子:

學生類 有姓名、年齡...

員工類 有姓名、年齡...

那么如果這個時候,我們還要添加男人類、女人類等,

那是不是又要去寫姓名 和 年齡等這些屬性...這樣就會很麻煩

然而 學生類和員工類 他們都共有 姓名、年齡這兩個屬性

之所以,他們都有這兩個屬性是因為他們都屬于人類

所以這個時候我們就可以把他們共有的屬性等提取出來共同封裝

在一個Person類中,然后讓學生類和員工類都繼承Person類

這樣,學生類和員工類就都擁有了姓名和年齡這兩個屬性,

他們共有的屬性、方法就交給了Person類來管理,而他們只需要管理

自己特有的屬性、方法就可以了

這樣做的好處就是實現了代碼的復用,方便了系統的擴展,

如:

以后我們還要再添加一個男人類或者女人類等,

就不用再去寫姓名、年齡等這些他們共有的成員了,只需要繼承Person類就可以了,

同樣,如果要添加一個他們共有的成員時,只需要在父類Person中添加就可以了

而不必去在他們每個類中都去添加新增的成員。

例子:

  public class Person //人類(這里他是父類)

  {

       public string Name{get;set;} //姓名

       public int Age{get;set;}     //年齡

  }

  public class Student:Person  //學生類 繼承 人類

  {

       //當Student繼承了Person后,Student就自動擁有了Person類的非private成員

  }

  public class Employee:Person  //員工類 繼承 人類

  {

       //當Employee繼承了Person后,Employee就自動擁有了Person類的非private成員

  }

  當我們創建一個Student對象和Employee對象時:

       Student stu = new Student();

       Employee emp = new Employee();

  就可以使用:

       stu.Name="張三";

       stu.Age = 20;

       emp.Name = "李四";

       emp.Age = 30;

   這就是因為他們都繼承了Person類的原因


2.繼承要符合 "子類 is a 父類" 的關系,就是說 子類是一個父類

例子:同上面所說,要想實現繼承,就必須要符合 子類 is a 父類的關系,

 如:學生是一個人,學生 is a 人  員工是一個人 員工 is a 人


3.繼承的單根性,在C#中一個子類只能繼承一個父類(就像一個兒子不能擁有多個父親一樣)


4.子類可以替換父類并且出現在父類能夠出現的任何地方,且程序的行為不會發生變化,但是

 反過來,父類對象不能替換子類對象,這種特性被稱作 "里氏替換原則(Liskor Subsitution Principle)"

例子:

上面的例子創建對象也可以這樣寫:

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:用于把一個類型轉換為另一個類型,類似于強制轉換,但是在強制轉換中,

如果給定的轉換類型不兼容(轉換失?。?,則會報錯,但是 as 轉換失敗的話,

不會報錯,會返回null

如:p1 as Student //把p1轉換為Student類型,如果失敗返回null


多態:

概念:多態是指兩個或多個屬于不同類的對象,對于同一個消息(方法調用)

 作出不同響應的方式。

實現多態的方式:

1.重載

2.虛方法

3.抽象方法(還有抽象屬性) → 抽象的成員沒有主體

4.泛型如:<T>

定義虛方法語法:

訪問修飾符 virtual 返回類型 方法名()

{

//方法體

//注意:虛方法不能是private

}

定義抽象方法語法:

訪問修飾符 abstract 返回類型 方法名(); //沒有方法體、不能是privatte

定義抽象屬性語法:

public abstract 數據類型 屬性名

{

get;set;  //不能帶有字段

}

子類中重寫虛方法和抽象方法語法:

訪問修飾符 override 返回類型 方法名()

{

//方法體

//注意:子類中重寫父類的方法必須要:返回類型、方法名、參數都一樣

}

子類中重寫抽象屬性例子:

public override int Age

{

get{return age;}

set{age = value;}

}

虛方法 和 抽象方法 區別:

虛方法:

1.用virtual修飾

2.要有方法體

3.可以被子類override(重寫)

4.除了密封類、靜態類外都可以寫(虛方法)

抽象方法:

1.用abstract修飾

2.沒有方法體

3.必須被非抽象的子類override(重寫)

4.必須存在于抽象類中

抽象類:

1.有抽象方法(屬性)的類一定是抽象類

2.抽象類不僅可以包含抽象方法、抽象屬性,同樣也可以包含其他屬性、方法和構造函數

3.抽象類不能被實例化

4.抽象類不能是靜態或者密封的,因為靜態類和密封類都不能被繼承

例子:

public abstract class Person //抽象類 Person 為父類

{

//定義了一個抽象方法

public abstract string Test();

}

public class Employee:Person  //繼承了Person類

{

//由于Employee類不是抽象類,所以必須重寫override父類Person的Test()方法

public override string Test()

{

//方法體

return ""; //override 必須要方法名、參數、返回類型都相同

}

}

記?。撼橄箢惒荒鼙粚嵗?/p>

Person p = new Person(); //這樣寫會報錯

但是,可以這樣寫:

Person p = new Employee(); //這樣寫是正確的

那么調用p.Test() 方法 會執行Employee里面的Test()方法,

也就是說,父類的方法一旦被子類重寫override以后,那么創建

的父類對象就會去調用它實際類型對象的方法(就是被重寫后的方法)

PS:抽象成員必須被非抽象子類override重寫

當然,如果是虛方法的話,在子類中沒有被重寫,那么就會調用父類的方法


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女