首先,這種分配是不合法的:
Coffee coffee = new Mocha(new Coffee());
一個Mocha
不是Coffee
也沒有從Mocha
到Coffee
隱式轉換。要「移除」裝飾器,您需要提供一個方法或一個強制轉換來執行此操作。所以,你可以添加一個去除裝飾方法Mocha
:
public Coffee Undecorate() {
return (Coffee)decoratedItem;
}
然後,你可以說
Coffee coffee = new Mocha(new Coffee()).Undecorate();
或者,您可以提供在Mocha
類隱式轉換操作符:
public static implicit operator Coffee(Mocha m) {
return (Coffee)m.decoratedItem;
}
然後你的線路
Coffee coffee = new Mocha(new Coffee());
將是合法的。
現在,您的問題暗示了對設計模式的潛在誤解(實際上,您的實現也暗示了一種誤解)。你想做的事很臭。使用裝飾器模式的正確方法就是這樣。請注意,CoffeeDecorator
派生自Coffee
!
abstract class Item { public abstract decimal Cost(); }
class Coffee : Item { public override decimal Cost() { return 1.99m; } }
abstract class CoffeeDecorator : Coffee {
protected Coffee _coffee;
public CoffeeDecorator(Coffee coffee) { this._coffee = coffee; }
}
class Mocha : CoffeeDecorator {
public Mocha(Coffee coffee) : base(coffee) { }
public override decimal Cost() { return _coffee.Cost() + 2.79m; }
}
class CoffeeWithSugar : CoffeeDecorator {
public CoffeeWithSugar(Coffee coffee) : base(coffee) { }
public override decimal Cost() { return _coffee.Cost() + 0.50m; }
}
然後你就可以說:
Coffee coffee = new Mocha(new CoffeeWithSugar(new Coffee()));
Console.WriteLine(coffee.Cost()); // output: 5.28
鑑於此,你有什麼需要去除裝飾它?
對不起讓我修復 – mikedev 2010-01-30 02:50:33
我應該澄清 - 我想刪除只有一個裝飾器,例如,如果我有3個不同的裝飾器,我想最終只有2.你的解決方案看起來像它是刪除所有裝飾器。 – mikedev 2010-01-30 02:53:40
假定你有'DecoratedCoffee咖啡=新的Mocha(新的CoffeeWithSugar(新的Coffee()));'並且你有一個方法'DecoratedCoffee.Undecorate'。 「DecoratedCoffee.Undecorate」的返回類型應該是什麼?如果它是'DecoratedCoffee',那麼'新的CoffeeWithSugar(新的Coffee())的結果是什麼?Undecorate()'?它應該是'Coffee'的新實例,但它不能是因爲它的返回類型是'DecoratedCoffee'; 'DecoratedCoffee'作爲返回類型是荒謬的。所以,它應該是'咖啡',但後來'新的摩卡咖啡(新的CoffeeWithSugar(新咖啡()))。未裝飾()。未裝飾()'不可能不鑄造。 – jason 2010-01-30 03:11:37