C# 当我在中产阶级中使用抽象关键字时,代码不起作用

C# 当我在中产阶级中使用抽象关键字时,代码不起作用,c#,design-patterns,abstract-class,C#,Design Patterns,Abstract Class,我有以下代码,运行良好: public abstract class Beverage { public string description = "Unknown beverage"; public virtual string getDescription() { return description; } public abstract double cost(); } public abstract class condim

我有以下代码,运行良好:

  public abstract class Beverage
{
    public string description = "Unknown beverage";
    public virtual  string getDescription()
    {
        return description;
    }
    public abstract double cost();
}

public abstract class condimentDecorator : Beverage
{
   // public abstract string getDescription();
}

public class DarkRoast : Beverage
{
    public DarkRoast()
    {
        description = "DarkRoast";
    }
    public override  double cost()
    {
        return 2.10;
    }
}
public class Espresso : Beverage
{
    public Espresso()
    {
        description = "Espresso";
    }
    public override double cost()
    {
        return 1.99;
    }
}

public class HouseBlend : Beverage
{
    public HouseBlend()
    {
        description = "House Blend Coffee";
    }
    public override double cost()
    {
        return .89;
    }
}


public class Mocha : condimentDecorator
{
    Beverage beverage;
    public Mocha(Beverage beverage)
    {
        this.beverage = beverage;
    }

    public override string getDescription()
    {
        return beverage.getDescription() + ", Mocha";
    }
    public override double cost()
    {
        return .20 + beverage.cost();
    }
}

public class Soy : condimentDecorator
{
    Beverage beverage;
    public Soy(Beverage beverage)
    {
        this.beverage = beverage;
    }

    public override string getDescription()
    {
        return beverage.getDescription() + ", Soy";
    }
    public override double cost()
    {
        return .10 + beverage.cost();
    }
}

public class Whip : condimentDecorator
{
    Beverage beverage;
    public Whip(Beverage beverage)
    {
        this.beverage = beverage;
    }

    public override string getDescription()
    {
        return beverage.getDescription() + ", Whip";
    }
    public override double cost()
    {
        return .10 + beverage.cost();
    }
}
我是这样使用它的:

 protected void Page_Load(object sender, EventArgs e)
    {
        Beverage beverage2 = new DarkRoast();
        beverage2 = new Mocha(beverage2);
        beverage2 = new Mocha(beverage2);
        beverage2 = new Whip(beverage2);
        Response.Write ("<br> " + beverage2.getDescription() + " : $" + beverage2.cost().ToString());
    }
但这改变了我当前的函数,并没有给出期望的结果,它只是将“未知饮料”显示为getDescription()的值,这是父类most的值

正常结果:

DarkRoast, Mocha, Mocha, Whip : $2.6 
使用“公共抽象字符串getDescription()”后的结果:


请建议我应该编写/更改什么,以便我可以强制“ConditionDecorator”的子类重写“getDescription();”,并在没有它的情况下获取Resultl作为其工作状态。

您可以创建如下新方法:

public abstract class condimentDecorator : Beverage
{
     public override string getDescription()
     {
          return getDescriptionInternal();
     }
     protected abstract string getDescriptionInternal();
}

这样,所有类都必须间接实现getDescription。

您可以创建如下新方法:

public abstract class condimentDecorator : Beverage
{
     public override string getDescription()
     {
          return getDescriptionInternal();
     }
     protected abstract string getDescriptionInternal();
}

这样,所有类都必须间接实现getDescription。

我认为您的类层次结构需要重新思考

这个怎么样:

我的建议是创建一个接口,
IBeverage
,在所有可饮用的东西上实现。然后像现在一样,为“基本”饮料创建一个基类——暗黑咖啡、浓咖啡、家庭混合饮料

对于调味品,您实现了一个新的抽象基类来实现IBeverage,但不提供默认的
GetDescription
实现。这个类还可以在其构造函数中使用IBeverage来强制其他调味品也这样做

我认为这样做应该行得通(未经测试,未编译-但你明白了)


我认为你的班级结构需要重新思考

这个怎么样:

我的建议是创建一个接口,
IBeverage
,在所有可饮用的东西上实现。然后像现在一样,为“基本”饮料创建一个基类——暗黑咖啡、浓咖啡、家庭混合饮料

对于调味品,您实现了一个新的抽象基类来实现IBeverage,但不提供默认的
GetDescription
实现。这个类还可以在其构造函数中使用IBeverage来强制其他调味品也这样做

我认为这样做应该行得通(未经测试,未编译-但你明白了)


快速谷歌(Quick google)得出了以下结论:


我没有尝试代码本身。

快速谷歌发现:

我没有尝试代码本身

public abstract class condimentDecorator : Beverage
{
     public override string getDescription()
     {
          return getDescriptionInternal();
     }
     protected abstract string getDescriptionInternal();
}
public interface IBeverage
{
  string GetDescription ();
}

public abstract class BeverageBase : IBeverage
{
  public virtual string GetDescription () { return "Unknown Beverage"; }
}

public class DarkRoast : BeverageBase { ... }
public class HouseBlend : BeverageBase { ...}

public abstract class CondimentBase : IBeverage
{
  public CondimentBase(IBeverage beverage)
  {
    Beverage = beverage;
  }
  protected IBeverage Beverage { get; set; }
  public abstract string GetDescription ();
}

public class Mocha : CondimentBase 
{
  public Mocha(IBeverage beverage)
    : base (beverage)
  { }
  public string GetDescription()
  {
    return Beverage.GetDescription() + ", Mocha";
  }
}