[學習筆記]C#繼承與多態

語言表達要清晰,結構明確。

繼承:一個類多用,減少代碼量,且將框架層次化。(和JAVA幾乎一樣,比較簡單)

class 基類
{
    構造函數(a,b){}
    property1;
    methode()
    {}
}

class 派生類:基類
{
    構造函數(c,d):base(a,b){} //構造函數需遵循這樣的寫法
    //在這裏可以寫新的方法,也直接調用父類方法和屬性,還可以複寫父類方法。
    overide methode(){}
}

多態:
靜態多態:編譯時響應。(也和JAVA一樣)

class a{
    method_a(int a){}
    method_a(String a){}
    method_a(int a,int b){}
    .......
}

動態多態:1.使用關鍵字 abstract 創建抽象類

下面是有關抽象類的一些規則:
* 您不能創建一個抽象類的實例。
* 您必須在子類中完全複寫父類的方法,一模一樣,不能多不能少。
* 抽象類的方法與類必須全部被abstract修飾,且不能包含任何具體邏輯。
* 通過在類定義前面放置關鍵字 sealed,可以將類聲明爲密封類。當一個類被聲明爲 sealed 時,它不能被繼承。抽象類不能被聲明爲 sealed。

通過上面三點特性,我們可以想到:抽象類就是用來規範子類的行爲的,就相當於類的模具,不具備實例化的操作的功能,這也就決定了其必須被繼承,所以sealed 不能被放在抽象類上。

using System;
namespace PolymorphismApplication{
   abstract class Shape //抽象類
   {
      public abstract int area();
   }
   class Rectangle:  Shape
   {
      private int length;
      private int width;
      public Rectangle( int a=0, int b=0)
      {
         length = a;
         width = b;
      }
      public override int area () //必須複寫,不復寫即報錯
      { 
         Console.WriteLine("Rectangle 類的面積:");
         return (width * length); 
      }
      /*public int test(){}*/  //添加父類沒有的方法亦報錯
   }

   class RectangleTester
   {
      static void Main(string[] args)
      {
         Rectangle r = new Rectangle(10, 7);
         double a = r.area();
         Console.WriteLine("面積: {0}",a);
         Console.ReadKey();
      }
   }
}

2.當有一個定義在類中的函數需要在繼承類中實現時,可以使用虛方法
虛方法是使用關鍵字 virtual 聲明的。虛方法可以在不同的繼承類中有不同的實現。對虛方法的調用是在運行時發生的。

動態多態性是通過 抽象類 和 虛方法 實現的。

虛方法可以在父類中用virtual定義,若子類未複寫該方法,則會自動採用父類的。

using System;
namespace PolymorphismApplication{
   class Shape 
   {
      protected int width, height;
      public Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      //虛方法
      public virtual int area() 
      {
         Console.WriteLine("父類的面積:");
         return 0;
      }
   }
   class Rectangle: Shape
   {
      public Rectangle( int a=0, int b=0): base(a, b)
      {

      }
      //複寫父類方法
      public override int area ()  
      {
         Console.WriteLine("Rectangle 類的面積:");
         return (width * height); 
      }
   }
   class Triangle: Shape
   {
      public Triangle(int a = 0, int b = 0): base(a, b)
      {

      }
      //複寫父類方法
      public override int area()
      {
         Console.WriteLine("Triangle 類的面積:");
         return (width * height / 2); 
      }
   }
   class Caller
   {
      public void CallArea(Shape sh)
      {
         int a;
         a = sh.area();
         Console.WriteLine("面積: {0}", a);
      }
   } 
   class Tester
   {

      static void Main(string[] args)
      {
         Caller c = new Caller();
         Rectangle r = new Rectangle(10, 7);
         Triangle t = new Triangle(10, 5);
         c.CallArea(r);
         c.CallArea(t);
         Console.ReadKey();
      }
   }}

總結:

  • 繼承,當你的父類方法不足以滿足開發需求,新方法不能歸屬父類,需要創建新類時,使用繼承將再合適不過。
  • 函數重載,當需要在一個類中使用多個方法滿足開發,且多個方法性質相同,僅僅參數不同,可以使用重載,規範命名。
  • abstract抽象類,當你需要創建多個結構要求嚴格的子類時,使用抽象類能夠避免子類寫出不必要的方法規範其結構。
  • virtual虛方法,與常規繼承中一樣,不復寫時使用父類方法,複寫時使用子類方法,但是,若使用 father obj=new child();若父類中是虛方法,編譯器會強制檢查實例類的方法調用,不會直接調用父類方法。一般繼承就會直接調用父類方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章