2009-09-10 32 views
2

我使用C#切換大小寫如何使用繼承來替換。 情況就像1,2,3,4所以 我怎麼能實現它。繼承如何取代開關盒?

爲如:

public Blocks(int code) 
    { 
     bool[,] shp1; 

     switch (code) 
     { 
      case 1: 
       this._Width = 4; 
       this._Height = 1; 
       this._Top = 0; 
       this._Left = 4; 

       shp1 = new bool[_Width, _Height]; 
       shp1[0, 0] = true; 
       shp1[1, 0] = true; 
       shp1[2, 0] = true; 
       shp1[3, 0] = true; 
       this.Shape = shp1; 
       break; 

      case 2: 
       this._Width = 2; 
       this._Height = 2; 
       this._Top = 0; 
       this._Left = 4; 

       shp1 = new bool[_Width, _Height]; 
       shp1[0, 0] = true; 
       shp1[0, 1] = true; 
       shp1[1, 0] = true; 
       shp1[1, 1] = true; 
       this.Shape = shp1; 
       break; 


      default: 
       throw new ArgumentException("Invalid Block Code"); 
     } 
    } 
+1

你的問題不是很清楚。請提供更多信息。 – rahul 2009-09-10 12:07:32

+1

請更精確。給出一個你的開關出現的代碼示例。 – cedrou 2009-09-10 12:07:35

+1

你能澄清一下你的意思嗎?「我如何使用繼承來替換」? – 2009-09-10 12:08:01

回答

8

的基本思想是不是具有決定基於狀態什麼的方法,你有不同類型的對象具有相同方法的不同實現方式,以便爲該類型對象做正確的事情。

假設您現在有一個Car類,其值(1,2,3 ...)指的是各種制動器配置。在當前的制動()方法中,你有一些代碼看起來像:

public class Car 
{ 
    public void Brake() 
    { 
      switch (this.BrakeType) 
      { 
       case 1: // antilock brakes 
       .... 
       case 2: // 4-wheel disc brakes, no antilock 
       .... 
       case 3: // rear-drum, front-disc brakes 
       .... 

      } 
    } 
} 

你真的想什麼做的是有實現的制動方法不同類別。在這種情況下,我會爲每種剎車類型設置一個BrakeStrategy。爲car配置正確的BrakeStrategy,然後從Brake方法中調用策略方法。

public class Car 
{ 
    public BrakeStrategy BrakeStrategy { get; set; } 

    public void Brake() 
    { 
     this.BrakeStrategy.Brake(); 
    } 
} 

public class ABSBrakes : BrakeStrategy 
{ 
    public void Brake() 
    { 
     ... do antilock braking... 
    } 
} 

var car = new Car { BrakeStrategy = new ABSBrakes(), ... }; 
car.Brake(); // does ABS braking 
+0

Thx爲例!但是,您能否告訴我我們在何處以及如何推動決策制定(即我們如何知道必須執行BrakeStrategy = ABSBrakes(),而不是= ReadDrunBrakes()?)現在切換了嗎?我的問題是否有意義? – Preets 2009-09-10 12:27:30

+2

你必須確實有某種決策結構來創建你想要使用的制動策略。這可以轉移到工廠模式,你確實使用了switch語句,但是這個語句與原來的語句相比要複雜得多。 除此之外,在需要時引入新的制動策略要容易得多。 – 2009-09-10 12:30:23

+0

再次感謝Frederik :) – Preets 2009-09-10 12:35:47

4

您可以將Strategy模式。
但是,如果你明白我的意思,你必須確保你沒有試圖用槍殺死蒼蠅。 確保您不會引入更多複雜性,然後嘗試刪除。 在某些情況下,用策略替換switch語句是一個很好的解決方案,而在其他情況下則不是。

正如我現在看到你的代碼,我想我會選擇某種工廠模式...

+0

弗雷德裏克,你明白這個問題嗎? – Preets 2009-09-10 12:09:38

+1

是的,我願意。 您可以使用多態性根據特定條件執行不同的功能。 對於存在的每個條件,您可以創建一個類(它從相同的基類型繼承)並將邏輯封裝到類中,而不是將它放在一個switch語句中。看到我關於戰略模式的鏈接。 – 2009-09-10 12:12:33

+0

@弗雷德裏克,很好的答案。 – Vadim 2009-09-10 12:15:46

1

如果您使用繼承,你仍然可以改變實現動態的,但不使用switch語句。

綜合以上BrakeType例如:

Dictionary<BrakeType, BrakeStrategy> strategyList = new Dictionary<BrakeType, BrakeStrategy>(); 

strategyList.Add(BrakeType.ABS, new ABSBrakes()); 
strategyList.Add(BrakeType.Disc, new DiscBrakes()); 
strategyList.Add(BrakeType.RearDrum, new RearDrumBrakes()); 

public class Car 
{ 
    public BrakeType TypeOfBrake {get; set;} 

    public void Brake() 
    { 
     strategyList[TypeOfBrake].Brake(); 
    } 
} 

所以不是一個大的switch語句混亂之類的邏輯,這是一個簡單的字典查詢。