Во-первых, это назначение не является законным:
Coffee coffee = new Mocha(new Coffee());
Mocha
не Coffee
и не существует неявное приведение из Mocha
к Coffee
. Чтобы «удалить» декоратор, вам нужно предоставить метод или бросок, чтобы сделать это. Таким образом, вы можете добавить undecorate метод 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
Учитывая это, то, что вам нужно undecorate это?
Извините, позвольте мне исправить это. – mikedev
Я должен был уточнить. Я хочу удалить только один декоратор, например, если бы у меня было 3 разных декоратора, я хочу закончить всего 2. Решение похоже на удаление всех декораторов. – mikedev
Скажите, что у вас был 'DecoratedCoffee coffee = new Mocha (новый CoffeeWithSugar (новый Coffee())),' и у вас был метод 'DecoratedCoffee.Undecorate'. Каким должен быть тип возврата 'DecoratedCoffee.Undecorate'? Если это 'DecoratedCoffee', то какой результат« нового CoffeeWithSugar (новый кофе()). Undecorate() '? Это должен быть новый экземпляр «Кофе», но это не может быть потому, что его тип возврата - «DecoratedCoffee»; 'DecoratedCoffee', поскольку тип возврата абсурден. Таким образом, это должен быть «Кофе». Но затем «новый мокко» (новый CoffeeWithSugar (новый кофе()). Undecorate(). Undecorate() 'невозможно без кастинга. – jason