Questo thread, Decorator pattern implementation, ha un'implementazione di un decoratore che utilizza classi astratte. Non mi piace per il semplice fatto che un CondimentDecorator NON è una bevanda nell'implementazione fornita qui. Io userei invece le interfacce. Le classi astratte non sono migliori per l'is-a, le relazioni e le interfacce migliori per l'has-a?Decoratori C#: interfacce o classi astratte?
public interface IBeverage
{
// get a description of the beverage
String Description { get; }
// calculate cost of the beverage
double Cost { get; }
}
// HouseBlend coffee implements IBeverage
public class HouseBlend : IBeverage
{
private string description;
public String Description
{
get { return description; }
}
private double cost;
public double Cost
{
get { return cost; }
}
// Constructor
public HouseBlend() { description = "House Blend"; cost = 0.89; }
}
// DarkRoast coffee implements IBeverage
public class DarkRoast : IBeverage
{
private string description;
public String Description
{
get { return description; }
}
private double cost;
public double Cost
{
get { return cost; }
}
// Constructor
public DarkRoast() { description = "Dark Roast"; cost = 1.10; }
}
// Mocha is a Decorator
public class Mocha
{
// Mocha has-a Beverage
private IBeverage m_beverage;
private string description;
public String Description
{
get { return description; }
}
private public double Cost
{
get { return cost; }
}
// Constructor binds the object passed to member var
public Mocha(IBeverage beverage)
{
m_beverage = beverage; // not necessary for the purpose of this example
description = m_beverage.Description + ", Mocha";
cost = 0.20 + m_beverage.Cost;
}
}
Use like this:
Mocha mhb = new Mocha(new HouseBlend()); // house blend with mocha flavor
Questa è probabilmente una soluzione migliore per programmers.stackexchange.com –
Sono completamente d'accordo, ma non era questo il punto della domanda a cui ti riferisci. –
Sì, masterizzando la tua unica e unica classe base su qualcosa che non è un-una relazione è una cattiva idea. –