public abstract class Beverage
{
public string description = "Unknown Beverage";
public string GetDescription()
{
return description;
}
}
public abstract class CondimentDecorator : Beverage
{
public abstract new string GetDescription();
}
public class Espresso : Beverage
{
public Espresso()
{
description = "Espresso";
}
class Mocha : CondimentDecorator
{
Beverage beverage;
public Mocha(Beverage beverage)
{
this.beverage = beverage;
}
public override string GetDescription()
{
return beverage.GetDescription() + ", Mocha";
}
kullanıyor. Şimdi kod beklendiği gibi yürütür bileşim kullanılmadan örneğini ve açıklama döndürdüğünde Espresso: I bileşimi kullandığınızda, içecek temel sınıfından içecek açıklama alanı erişildiğinde, ancakC# bileşimin anlamaya çalışırken, ama sargı nesneler temel sınıf alan erişme yerine espresso bileşeni olması amaçlanmıştır ve Mocha sargı olması amaçlanmıştır türetilmiş uygulama
static void Main(string[] args)
{
Beverage beverage = new Espresso();
Console.WriteLine(beverage.GetDescription());
Output: Espresso
ve program döndürür Açıklama "Bilinmeyen İçecek." "Espresso, Mocha" Beverage
yılında GetDescription
yöntemi sanal değilse da ondan
Beverage beverage2 = new Espresso();
beverage2 = new Mocha(beverage2);
Console.WriteLine(beverage2.GetDescription());
Neden soyut yöntem beyanında 'new' anahtar sözcüğünü kullanıyorsunuz? – kai
da, "sanal" veya "soyut" olmadığı sürece C# içindeki bir yöntemi geçersiz kılabilirsiniz. 'Beverage.GetDescription()' da değildir. – kai
Bunu daha açık bir şekilde açıklayan yazıyı bulamıyorum, ancak sol tarafta “İçecek” türünü seçmeniz gerektiğini düşünüyorum, bu yüzden “beverage2.GetDescription()” ifadesini çağırmak sadece temel sınıflar yöntemini çağırır. Muhtemelen bunu yapmak zorundasınız, Console.WriteLine (((Mocha) beverage2) .GetDescription()); – Quantic