C#forUnity快速入門(連載8)-C#抽象類與接口

 C# for Unity 編程語言快速入門教程(連載8)---C#OOP編程之抽象類與接口

 

   C#的抽象類與接口,是C#OOP編程中非常重要的概念,對於開發出“高內聚、低耦合”的優秀項目具有重要的作用。

   C#抽象類是用關鍵字abstract 表示的,它即可以修飾類(抽象類),也可以修飾方法(抽象方法)。抽象類主要的作用是:列舉一個類所需要的行爲,提供一系列的規定,約束子類行爲。


  C#抽象類與抽象方法具備以下重要規則:

  1:抽象類不能被實例化。

  2:抽象類不明確提供具體 方法實現。(但可以包含普通的方法)

  3:定義基類(父類)中的抽象方法,則派生類(子類)必須重載(重寫)該方法。
  4:抽象方法一定屬於抽象類,但抽象類不一定要包含抽象方法。
  5:抽象方法不能是私有的,而且抽象方法及其重載方法的訪問限制應當相同。
  6:抽象方法不能使用virtual 關鍵字進行修飾。
  7:抽象類不能是密封或靜態的  。

  8:抽象類必須由其子類實現它的抽象方法,除非子類也是抽象類。

  9:繼承抽象類的派生類,必須使用override 實現抽象方法。

10:抽象方法一定屬於抽象類,但抽象類不一定要包含抽象方法。


  我們生活中的接口是: “不同物理設備與軟件程序實現溝通與數據傳輸的規格與標準”(例如:USB接口,即可以應用在鼠標鏈接上,也可以應用在移動硬盤、USB盤、手機、數碼相機、充電寶....)
  C#中的接口就是:“某個事物對外提供的一些功能的申明”,我們使用interface 關鍵字來聲明一個接口,注意這裏接口是一個與類“平行”的編程單位,相互之間沒有隸屬關係。

 

  C#的接口具備以下重要規則:

  1: 接口可以繼承,類似類的繼承。

  2: 接口可以實現多重繼承,類不可以。

  3: 可以把接口理解爲更純的抽象類,因爲接口中所有的方法都是抽象的,沒有普通方法。

  4: 接口和抽象類不能被實例化。

  5: 接口的任何派生實現類,都必須實現接口的所有方法。

  6: 接口不允許有任何構造函數或字段。

  7: 接口成員總是公共的,不能聲明虛擬和靜態的。

  8: 接口中不允許指定任何訪問修飾符,(隱式爲public)不需要訪問修飾符。

  9: 類不允許多繼承,但接口允許多繼承。
      好的編程習慣: 使用接口名作爲方法的前綴,這稱爲“顯示接口實現”。
      對於明確指定了接口的方法,就不再允許使用修飾符,一律爲 public。


  以上兩篇文章我們學習了方法重載,方法重寫,抽象類,抽象方法,接口等。現在總結一些概念之間的區別點:

  1:不能同時使用 virtual 和 override 修飾一個方法。
  2:虛擬方法不能是私有的。
  3:對於 interface 、virtual、override、sealed 關鍵字的理解:
        interface: 引入一個方法的名稱
        virtual:   方法的第一個實現。
        override:  方法的另一個實現。
        sealed:    方法的最後一個實現。


   目前關於C#基礎編程,截至本篇筆者提供了8篇技術介紹性文章,現在提供從類的訪問修飾符到目前接口的一些典型學習習題,供C#初學者學習之用。

編程題目:

1: 學習定義類與訪問修飾符。   
1.1>: 已知交通工具類定義如下。
class Vehicle
{
   private int _length;  //長度
   private int _width;   //寬度

   public void Drive(){}; //駕駛方法
}
要求:(1)實現設個類;(2)定義並實現一個小車類car,是它的派生類,小車本身的私有屬性有載人數,小車的方法有init(設置車輪數、重量和載人數),get passenger(獲取載人數),print(打印車輪數、重量和載人數)。


2: 學習繼承
  2.1>: 編寫一個學生和教師的數據輸入和顯示程序,學生數據有編號、姓名、班號和成績,教師數據有編號、姓名、職稱和部門。要求將編號、姓名輸入和顯示設計成一個類person,並作爲學生數據操作類student和教師數據操作類teacher的基類。

3: 方法重載(靜態多態性)
   3.1>:    利用多態性實現多功能計算器:
          A)定義方法名爲computeMethod 的方法,實現加法器。
          B)再定義方法名爲computeMethod 的方法,實現具備加減乘除綜合計算功能。
          C)在main 方法中調用以上方法,且測試。
   3.2>:    利用多態性實現如下功能。
         A)定義一個Father 類,利用構造方法的重載概念定義三個構造方法。
         B)定義Child 類繼承Father類,在Child的構造方法中分別調用父類不同的構造方法。

4: 方法重寫
   4.1>: 設計一個基類,在其中創建方法MConvert,這個方法接受一個代表公里數的參數,將其轉換爲對等的英里數之後,然後創建一個繼承此類的子類,增加可將輸入的公斤數轉換爲磅的新方法 KConvert, 最後產生子類的實例對象, 測試這兩個功能。
   提示信息:
   1千米(公里) = 0.62英里
   1千克(公斤) = 2.2磅


   4.2>: 調整上一題的內容,將其中的MConvert方法聲明爲virtual, 然後在子類中進行覆寫,以其所接受的參數爲正方形邊長,轉換爲英里後計算其面積。


   4.3>: 創建一個類,重寫ToString() 方法, 當其被引用的時候,能夠輸出此類對象的說明文字,如下:   “測試用的myObject 類對象”


5: 抽象類、抽象方法
  5.1>: 編寫一個程序,求圓、圓內接正方形和圓外切正方形的面積和周長。要求設計抽象基類、抽象方法,使用動態多態性。
      提示信息:
       公式: 勾股定義: 直角三角形中兩邊長平方的和等於第三邊的平方:a*a+b*b=c*c            
       圓的半徑使用 r:
       內切正方形的邊長=r*r+r*r=x*x
                                x=sqrt(2(r*r))
       內切正方形面積    
                 x*x
      內切正方形周長
                  4x
       外切正方形面積
                (r*2)*(r*2)
       外切正方形周長
                (r*2)*4=8r

       形狀:   shape  
       圓:     circle  
       正方形: square、
       面積:   area.
       周長:   length.

  5.2>:下面Shape類是一個表示形狀的抽象類,Area ( )爲求圖形面積的函數。請從Shape類派生梯形類(Trapezoid)、圓形類(Circle),三角形類(Triangle),並給出具體的求面積函數。其中,所有派生類計算面積需要用到的參數由構造函數給出,梯形面積計算需要上底、下底和高,三角形面積需要底和高,圓形面積需要半徑。
形狀的抽象類聲明如下:

abstract class Shape {
  abstract public double Area( );
}


6: 接口、多重接口

   6.1>:A)定義Calculate接口,

       接口文件如下:
       interface Calculate
       {
            void getArea();  //計算圓面積。
            void getZC();    //計算圓周長
       }
        
     B) 定義circularity 類,實現接口Calculate. 且調試後輸出結果。

  6.2>:  設計一個類TClass, 繼承下面的接口IMeasure, 實現其中的Length() 與 Area()方法,來計算特定長度等邊三角形的邊長和麪積。
     interface IMeasure
     {
       int Length(int s);
       int Area(int s);
     }

  6.3>   承上題,設計一個測試程序,創建TClass 的實例對象,調用其中的方法計算邊長爲10的三角形面積和周長。

  6.4>:  承上題,設計一個測試程序,創建TClass 的實例對象,將其轉型爲 IMeasure 類型,調用其中的方法來計算邊長爲10的三角形面積和周長。

  6.5>:  另外設計一個新的類,同時繼承下面的接口 IAMeasure 及上面第2題的IMeasure,除了提供對特定長度等邊三角形的邊長與面積的計算方法外,還實現了IAMeasure的Area()成員,提供對正方形面積的計算方法。
      interface IAMeasure
      {
          int Area(int s);
      }

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章