2 Stimmen

Wie wird das Schaltergehäuse ersetzt?

I m mit C# Switch Fall, wie ich mit Vererbung ersetzen kann. Fall ist wie 1,2,3,4 so wie kann ich es implementieren.

z.B.:

    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");
        }
    }

9voto

tvanfosson Punkte 506878

Die Grundidee ist, dass man statt einer Methode, die je nach Zustand entscheidet, was zu tun ist, verschiedene Objekttypen hat, die unterschiedliche Implementierungen derselben Methode haben, die das Richtige für den jeweiligen Objekttyp tun.

Nehmen wir an, Sie haben jetzt eine Car-Klasse und die Werte (1, 2, 3, ...) beziehen sich auf verschiedene Bremskonfigurationen. In Ihrer aktuellen Brake()-Methode haben Sie Code, der wie folgt aussieht:

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
                ....

          }
     }
}

Was Sie wirklich tun möchten, ist, verschiedene Klassen zu haben, die die Brake-Methode implementieren. In diesem Fall würde ich für jeden der Bremstypen eine BrakeStrategy haben. Weisen Sie dem Autoobjekt die richtige BrakeStrategy für seine Konfiguration zu und rufen Sie dann einfach die Strategiemethode von der Brake-Methode aus auf.

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

4voto

Frederik Gheysels Punkte 54908

Sie können eine Strategie modèle.
Aber Sie müssen darauf achten, dass Sie nicht versuchen, eine Fliege mit einer Pistole zu töten, wenn Sie verstehen, was ich meine. Achten Sie darauf, dass Sie nicht mehr Komplexität einführen, als Sie eigentlich beseitigen wollen. In manchen Fällen ist das Ersetzen der switch-Anweisung durch eine Strategie eine gute Lösung, in anderen Fällen nicht.

So wie ich Ihren Code jetzt sehe, würde ich mich wohl für eine Art Fabrikmuster entscheiden ...

1voto

Dr Herbie Punkte 3870

Wenn Sie Vererbung verwenden, können Sie die Implementierung immer noch dynamisch ändern, aber ohne eine Switch-Anweisung zu verwenden.

Nehmen wir das obige Beispiel des 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();
    }
}

Anstelle einer großen Switch-Anweisung, die die Logik der Klasse durcheinander bringt, ist es also eine einfache Wörterbuchabfrage.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X