2012-01-22 32 views
12

Cố gắng triển khai mẫu trang trí trong C# từ mã trong sách "Mẫu thiết kế đầu tiên" (được viết bằng Java).Thực hiện mẫu trang trí

Tôi mới bắt đầu với C# và do đó vẫn còn mới với cú pháp, vì vậy tôi không chắc chắn lý do tại sao tôi không thể nhận được dòng nhận xét của mã bên dưới để hoạt động.

Đây là lớp trừu tượng-cơ sở đầu tiên và các lớp học có nguồn gốc của nó trong mẫu Decorator:

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

Các mã vi phạm là trong phương pháp chi phí() của lớp 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 mặc dù cuốn sách sử dụng Java liên kết [book's website] (http://headfirstlabs.com/books/hfdp/) để [mẫu mã trong C#] (http://www.msquaredweb.com/ DesignPatterns/HeadFirstDesignPatternsInCSharp.zip) và C++. –

+0

Điều cần biết. Tôi sẽ kiểm tra nó ra – dtg

Trả lời

11

Thay đổi new thành override. Ngoài ra, m_description phải là protected.

+0

Derp. Tuyên bố m_description là bảo vệ thay vì tư nhân nên đã không có trí tuệ ... – dtg

+0

Tôi sẽ khuyên giữ trường địa phương là riêng tư và hiển thị nó cho người kế thừa thông qua một tài sản được bảo vệ. –

+0

Không chắc chắn về cách thực hiện điều này ... Tôi đã có một danh sách thuộc tính để thiết lập và nhận được m_description gọi là Mô tả, nhưng tôi không chắc chắn cách thức này sẽ được sử dụng để truy cập vào phương thức Cost() của đối tượng đồ uống. – dtg

1

Mã của bạn trông như thế nào.

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(); 
    } 
} 
Các vấn đề liên quan