C#物件導向特徵的具體實現及作用詳解

來源:互聯網
上載者:User

標籤:

C#物件導向特徵的具體實現及作用詳解 字型:[增加 減小] 類型:轉載所有的面相對象思想,歸根結底是為了簡化代碼,減少代碼量,構建更符合現實生活邏輯的程式碼,從而減輕程式員的負擔。不能一味地或者說刻意地去使用面相對象的思想而忽略了程式所實現的功能或者架構,要根據實際情況 

眾所周知,物件導向編程的特點為:封裝、繼承、多態。C#是一門完全物件導向的語言,由於比Java推出的時間還要晚,所以對物件導向的思想的體現比Java還要完美,那麼在C#中如何體現封裝、繼承和多態呢?下面舉例並進行說明。

1.封裝

封裝的好處有以下幾點:

①資料不外泄,可以做到一定的保護

②類的使用者不用考慮具體的資料運算,方便

③程式結構性強,層次清晰,便於維護

對相關的欄位、方法進行封裝固然對物件導向編程起到不可缺少的重要作用,但並不代表不可以訪問類或者說具體的執行個體化對象中的內容,而且為使用者提供 介面,僅僅讓他們調用就可以了,他們只做他們的工作,不需要考慮或者顧及你寫的類具體是做什麼的,更不用考慮你寫的每一行代碼是什麼意思。

在C#中,對於變數的封裝,往往將需要被在本類以外調用的,以屬性的形式出現,而不像C++中是直接以public成員或者private成員加上相關的方法調用,那樣要麼不符合物件導向的特點,要麼太麻煩。

C#中屬性的聲明:

代碼如下:
public class TestClass
    {
        public string Info
        {
            get;
            set;
        }
    }
屬性的聲明類似一個函數,首先有存取層級(如果設成private等於設成私人欄位,還不如直接寫個變數),然後是類型,接著是屬性名稱,後面是一對花括弧,裡面的get、set用於控制屬性唯讀,還是唯寫,還是可讀可寫。當然,這裡的get、set都是直接以分號結束,被稱作是自動屬性,如果有需要,也可以自訂get和set,get中需要加上和屬性類型一直的傳回型別。

C#對方法的封裝只需要改變方法的存取層級,比如設為public,或者設為private(或者不寫),對應的就是可從外部存取以及僅能從內部訪問。

2.繼承

大家都知道繼承機制可以提高代碼的可複用性和可擴充性,以提高開發效率,減少代碼量。C#和C++不同,可從一個類繼承或實現多個介面,但不可以從多個類繼承。

繼承文法樣本:


class Son : Father
{
      //Do Something
}
繼承可以使子類或者說衍生類別獲得父類或者說基類的所有可被繼承的內容,比如欄位、方法,但對存取層級有一定限制,那就是private層級不可被繼承。除了這點,這裡需要說明的是,如果需要調用基類(父類)中的成員,需要使用base關鍵字,而如果在方法中,需要使用當前類中的成員,但因為重名(比如參數和類成員變數重名),需要使用this關鍵字來確定到底訪問的是哪個成員。

C#所有的類都繼承自System.Object,所以不管是什麼類都有幾個固定的、公用的方法,這是C#體現物件導向思想非常不錯的一點!

下來說一下靜態類的特徵:

①靜態類不能使用sealed或abstract修飾符

②靜態類必須直接繼承自System.Object,不能是其他

③靜態類不能實現任何介面

④靜態類不能包含任何操作符

⑤靜態類不能包含使用protected或protected internal修飾的靜態成員

⑥靜態類智能包含靜態成員

⑦靜態類可以包含靜態建構函式,但不能包含執行個體建構函式

⑧靜態類不能被執行個體化

⑨靜態類是密封的,不能被繼承

由於靜態類是在載入包含該類的程式集時由CLR自動載入,所以用靜態類實現一些不操作資料,並且不與代碼中的特定對象關聯的方法是非常不錯的選擇。

剩下要注意的就是在使用繼承的時候,搞清建構函式的調用順序,先初始化類的執行個體欄位,再調用基類建構函式,最後調用自己的建構函式。

3.多態

通過基類的引用調用在衍生類別中實現的方法時,不同的衍生類別將產生不同的調用結果,這就是多態,而C#中的多態分為運行時多態和編譯時間多態。編譯時間多態利用函數重載實現,運行時多態通過覆寫虛方法實現。

①方法重載

前提:在同一個類中,方法名相同,方法簽名不同(包括方法的名稱及參數資訊(形參的修飾符、數目、類型以及泛型參數的數目),但傳回值類型、形參和型別參數的名稱並不屬於方法簽名的一部分)

方法重載樣本:
public string Function(int x)
{
 return x.ToString();
}
public string Function(DateTime x)
{
 return x.ToString("yyyy-MM-dd HH:mm:ss.fff");
}
public string Function(double x,double y)
{
 return (x+y).ToString();
}


以上樣本實現了一個名為Function,傳回型別為string的三種重載,分別是將一個int型參數返回為string型,將一個DateTime型參數返回為“年-月-日 時:分:秒.毫秒”格式的字串,將兩個double型參數相加的和轉換為string類型

②虛方法

定義虛方法需要使用virtual關鍵字,如下所示:


class Car
{
 public virtual void Drive()
 {
  Console.WriteLine("駕駛..");
 }
}


之所以將Drive設定為虛方法,就是為了讓派生的子類去重寫,這樣所有Car的衍生類別都可以實現新的Drive方法。

注意:virtual關鍵字必須位於返回方法的傳回型別之前,虛方法可以有方法體,而抽象方法不允許有方法體

剩下兩項注意:靜態成員函數不能是虛函數,建構函式不能是虛函數

覆寫方法樣本:


class Track : Car
{
 public override void Drive()
 {
  Console.WriteLine("開大卡車");
 }
}
class Jeep : Car
{
 public override void Drive()
 {
  Console.WriteLine("開吉普車");
 }
}


③抽象類別及抽象方法
有以下幾點注意:

(1)它們不能被執行個體化

(2)抽象方法不能有方法體,所在類必須是抽象類別

(3)使用abstract關鍵字

(4)抽象方法無實現,後面緊跟分號

(5)抽象類別的衍生類別必須實現所有抽象方法

(6)當抽象類別從基類繼承虛方法時,抽象類別可以使用抽象方法重寫該虛方法。

 

4.總結

所有的面相對象思想,歸根結底是為了簡化代碼,減少代碼量,構建更符合現實生活邏輯的程式碼,從而減輕程式員的負擔。不能一味地或者說刻意地去使用面相對象的思想而忽略了程式所實現的功能或者架構,要根據實際情況,合理利用面相對象思想,減輕負擔,並為他人提供方便!

 

C#物件導向特徵的具體實現及作用詳解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.