Mencoba mengimplementasikan pola dekorator dalam C# dari kode di buku "Head First Design Patterns" (ditulis dalam Java).
Saya baru memulai dengan C# dan oleh karena itu saya masih baru dalam sintaksisnya, jadi saya tidak yakin mengapa saya tidak dapat membuat baris kode yang dikomentari di bawah ini berfungsi.
Berikut adalah kelas berbasis abstrak pertama dan kelas turunannya dalam pola 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; }
}
Kode yang melanggar ada dalam metode Cost() kelas 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();
}
}