2012-01-22 11 views
12

Próba zaimplementowania wzoru dekoratora w języku C# z kodu w książce "Head First Design Patterns" (napisana w Javie).Implementacja wzoru dekoratora

Właśnie zaczynam od C# i jestem w związku z tym wciąż nową składnią, więc nie jestem pewien, dlaczego nie mogę uzyskać komentarza linii kodu poniżej do pracy.

Oto pierwsza klasa abstrakcyjnych podstawowy i klasy pochodnych do wzoru Dekorator:

using System; 

public abstract class Beverage 
{ 
    private String m_description; 

    // get a description of the beverage 
    public virtual String Description { get { return m_description; } } 

    // calculate cost of the beverage 
    public abstract double Cost(); 
} 

// HouseBlend coffee implements Beverage 
public class HouseBlend : Beverage 
{ 
    // Constructor 
    public HouseBlend() { m_description = "House Blend"; } 

    // calculate base cost of House Blend 
    public override double Cost() { return 0.89; } 
} 

// DarkRoast coffee implements Beverage 
public class DarkRoast : Beverage 
{ 
    // Constructor 
    public DarkRoast() { m_description = "Dark Roast"; } 

    // calculate base cost of Dark Roast 
    public override double Cost() { return 1.00; } 
} 

// Espresso coffee implements Beverage 
public class Espresso : Beverage 
{ 
    // Constructor 
    public Espresso() { m_description = "Espresso"; } 

    // calculate base cost of Espresso 
    public override double Cost() { return 1.99; } 
} 

Kod wykraczająca w sposobie koszt() klasy Mocha:

using System; 

// abstract base class CondimentDecorator is-a Beverage 
public abstract class CondimentDecorator : Beverage {} 

// Mocha implements the CondimentDecorater 
public class Mocha : CondimentDecorator 
{ 
    // Condiment decorator has-a Beverage (recursion!) 
    private Beverage m_beverage; 

    // Constructor binds the object passed to member var 
    public Mocha(Beverage beverage) 
    { 
     this.m_beverage = beverage; 
    } 

    // getter implements abstract class Description 
    public override String Description 
    { 
     get 
     { 
      return m_beverage.Description + ", Mocha"; 
     } 
    } 

    // get the Cost of the condiment plus the base-cost 
    // of the original beverage 
    public new double Cost()    // ERROR: 'Mocha.Cost()' hides inherited 
    {          // member 'Beverage.Cost()' 
     return 0.20 + m_beverage.Cost(); 
    } 
} 
+11

FYI chociaż książka używa Java internetową [książki] (http://headfirstlabs.com/books/hfdp/) Odnośniki do [przykładowy kod w C#] (http://www.msquaredweb.com/ DesignPatterns/HeadFirstDesignPatternsInCSharp.zip) i C++. –

+0

Dobrze wiedzieć. Sprawdzę to na – dtg

Odpowiedz

11

Zmień new na override. Ponadto, m_description powinien być protected.

+0

Derp. Deklarowanie m_description jako chronionego zamiast prywatnego powinno być bezużyteczne ... – dtg

+0

Zaleciłbym zachowanie lokalnej przestrzeni jako prywatnej i ujawnienie jej spadkobiercom za pośrednictwem chronionej nieruchomości. –

+0

Nie jestem pewien jak to zrobić ... Już mam listę właściwości do ustawiania i otrzymywania m_description o nazwie Description, ale nie jestem pewien, w jaki sposób byłby używany do uzyskania dostępu do metody Cost() obiektu napoju. – dtg

1

Tak powinien wyglądać twój kod.

public abstract class Beverage 
{ 
    protected string m_description = "Unknown Beverage"; 

    public virtual string GetDescription() 
    { 
     return m_description; 
    } 

    public abstract double Cost(); 
} 

public abstract class CondimentDecorator : Beverage 
{ 
} 

public class Espresso : Beverage 
{ 
    public Espresso() 
    { 
     m_description = "Espresso"; 
    } 

    public override double Cost() 
    { 
     return 1.99; 
    } 
} 

public class HouseBlend : Beverage 
{ 
    public HouseBlend() 
    { 
     m_description = "House Blend Coffe"; 
    } 

    public override double Cost() 
    { 
     return 0.89; 
    } 
} 

public class DarkRoast : Beverage 
{ 
    public DarkRoast() 
    { 
     m_description = "Dark Roast"; 
    } 

    public override double Cost() 
    { 
     return 0.99; 
    } 
} 

public class Mocha : CondimentDecorator 
{ 
    Beverage beverage; 

    public Mocha(Beverage beverage) 
    { 
     this.beverage = beverage; 
    } 

    public override string GetDescription() 
    { 
     return beverage.GetDescription() + ", Mocha"; 
    } 

    public override double Cost() 
    { 
     return 0.20 + beverage.Cost(); 
    } 
} 

public class Soy : CondimentDecorator 
{ 
    Beverage beverage; 

    public Soy(Beverage beverage) 
    { 
     this.beverage = beverage; 
    } 

    public override string GetDescription() 
    { 
     return beverage.GetDescription() + ", Soy"; 
    } 

    public override double Cost() 
    { 
     return 0.15 + beverage.Cost(); 
    } 
} 

public class Whip : CondimentDecorator 
{ 
    Beverage beverage; 

    public Whip(Beverage beverage) 
    { 
     this.beverage = beverage; 
    } 

    public override string GetDescription() 
    { 
     return beverage.GetDescription() + ", Whip"; 
    } 

    public override double Cost() 
    { 
     return 0.10 + beverage.Cost(); 
    } 
}