1. 程式人生 > 程式設計 >淺談C# 抽象類與開閉原則

淺談C# 抽象類與開閉原則

1.抽象類與抽象方法:

(1)使用關鍵字abstract修飾的類,稱為抽象類.

(2)抽象類只是用到一個類所具有的行為,不能單獨通過建立物件來使用.使用new是錯誤的.可以通過派生類來實現其函式成員的具體邏輯。

(3)抽象類中可以有抽象方法,也可以沒有任何抽象方法.只要類中存在一個抽象方法,這個類就是抽象類。

(4)抽象類不能是靜態的(static)或者密封的(sealed)

下面就是一個簡單的抽象類

abstract class Vehicle
 { 
  public abstract void test();
  public void VehicleTest()
  {

  }
 }

 class Car : Vehicle
 { 
  public override void test()
  {

  }

 }

2.開閉原則

如果不是為了修改bug,或者是新增新的功能,不要隨便更改類的程式碼。

換句話說,我們應該封裝那些確定的,不變的,穩定的,固定的。把不確定的,有可能會改變的成員宣告為抽象類,留給子類去實現。

3.我們簡單實現了一個繼承

class Program
 {
  static void Main(string[] args)
  {
   Vehicle raceCar = new RaceCar();
   
   Console.ReadKey();
  }
 }

 /// <summary>
 /// 交通工具類
 /// </summary>
 class Vehicle
 {
  /// <summary>
  /// 停車
  /// </summary>
  public void Stop()
  {
   Console.WriteLine("Stopped");
  }
  /// <summary>
  /// 加油
  /// </summary>
  public void Fill()
  {
   Console.WriteLine("Fill");
  } 
 }

 class Car : Vehicle
 {
  public void Run()
  {
   Console.WriteLine("Car is running"); 
  } 
 }
 class RaceCar : Car
 { 
  public void Run()
  {
   Console.WriteLine("RaceCar is running");

  } 
 }

從上面的程式碼我們可以看出這是一個繼承鏈,其中Run方法是根據不同種類的車來區別的,所以我們如果想實現多型,比如 Vehicle raceCar = new RaceCar();此時raceCar 物件是調不到Run方法的,因為Vehicle類中沒有這個方法,以前對於這種情況的解決方法是在Vehicle中加上Run方法,並且判斷有什麼型別:

public void Run(string type)
  {
   if (type == "Car")
   {
    Console.WriteLine("Car is running");
   }
   else if (type == "RaceCar")
   {
    Console.WriteLine("RaceCar is running");
   }
   else
   {

   }
  }

如上程式碼,這樣的話,當增加新型別的時候還要再改這個基類中的方法,違反了開閉原則( 如果不是為了修改bug,或者是新增新的功能,不要隨便更改類的程式碼),所以需要做一下修改:

public virtual void Run()
  {
  
    Console.WriteLine("RaceCar is running");
   
  }

派生類來重寫這個方法,這樣增加新型別的時候重寫就可以,就不用再更改基類的程式碼了。但是,如果你覺得這個類中基本不會呼叫這個Run方法,那我們可以去掉方法體,改成抽象方法,相應的類也變成抽象類,Run完全由派生類來重寫。

class Program
 {
  static void Main(string[] args)
  {
   Vehicle raceCar = new RaceCar();

   Console.ReadKey();
  }
 }

 /// <summary>
 /// 交通工具類
 /// </summary>
 abstract class Vehicle
 {
  /// <summary>
  /// 停車
  /// </summary>
  public void Stop()
  {
   Console.WriteLine("Stopped");
  }
  /// <summary>
  /// 加油
  /// </summary>
  public void Fill()
  {
   Console.WriteLine("Fill");
  }
  public abstractvoid Run()
  {
  
    Console.WriteLine("RaceCar is running");
   
  }
 }

 class Car : Vehicle
 {
  public override void Run()
  {
   Console.WriteLine("Car is running");
  }
 }
 class RaceCar : Car
 {
  public override void Run()
  {
   Console.WriteLine("RaceCar is running");

  }
 }

4.介面與抽象類

(1)具體類-》抽象類-》介面,越來越抽象,內部實現的類越來越少。

(2)抽象類為複用而生:專門作為基類來使用,也具有解耦功能。

(3)封裝確定,開放不確定的,推遲到子類實現。

(4)介面為解耦而生,高內聚,低耦合,方便單元測試。

(5)都不能例項化,只能宣告變數,引用具體類的例項。

到此這篇關於淺談C# 抽象類與開閉原則的文章就介紹到這了,更多相關C# 抽象類與開閉原則內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!