2012-01-22 21 views
12

"हेड फर्स्ट डिजाइन पैटर्न" पुस्तक (जावा में लिखा) में कोड से सी # में डेकोरेटर पैटर्न लागू करने के लिए कोशिश कर रहा है।डेकोरेटर पैटर्न कार्यान्वयन

मैं बस के साथ सी # शुरू कर रहा हूँ और इसलिए अभी भी वाक्य रचना करने के लिए नया हूँ, इसलिए मुझे यकीन है कि मैं क्यों कोड की टिप्पणी की रेखा से नीचे काम करने के लिए नहीं मिल सकता है नहीं कर रहा हूँ।

यहाँ पहली सार-आधार वर्ग है और डेकोरेटर पैटर्न में अपनी व्युत्पन्न वर्ग:

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

अपमानजनक कोड मोचा वर्ग की विधि मूल्य() में है:

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 हालांकि किताब जावा [पुस्तक की वेबसाइट] का उपयोग करता है (http://headfirstlabs.com/books/hfdp/) [सी # में नमूना कोड] (करने के लिए लिंक http://www.msquaredweb.com/ DesignPatterns/HeadFirstDesignPatternsInCSharp.zip) और सी ++। –

+0

जानना अच्छा है। मैं इसे – dtg

उत्तर

11

new से override बदलें। इसके अलावा, m_descriptionprotected होना चाहिए।

+0

Derp की जांच करूँगा। घोषणा m_description के रूप में के बजाय निजी के संरक्षित किया जाना चाहिए था एक नहीं brainer ... – dtg

+0

मैं निजी रूप में स्थानीय क्षेत्र में रखते हुए और एक संरक्षित संपत्ति के माध्यम से उत्तराधिकारियों के संपर्क में लाने की सलाह देंगे। –

+0

सुनिश्चित नहीं हैं कि यह कैसे किया जा होगा ... मैं पहले से ही मैं स्थापित करने और हो रही m_description बुलाया विवरण के लिए एक संपत्ति सूची है, लेकिन मुझे यकीन है कि यह कैसे पेय वस्तु की विधि मूल्य() का उपयोग करने के लिए किया जाएगा नहीं कर रहा हूँ। – dtg

6

आप ओवरराइड के बजाय नया रूप मोचा की विधि मूल्य() घोषित किया है। यहाँ देखें अंतर: http://blogs.msdn.com/b/csharpfaq/archive/2004/03/12/what-s-the-difference-between-code-override-code-and-code-new-code.aspx

+0

उस स्पष्टीकरण के लिए धन्यवाद; अब मैं अंतर देखता हूं। – dtg

1

इस प्रकार से आपका कोड दिखना चाहिए है।

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(); 
    } 
} 
संबंधित मुद्दे