代码之家  ›  专栏  ›  技术社区  ›  Dr. Rajesh Rolen

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

  •  0
  • Dr. Rajesh Rolen  · 技术社区  · 15 年前

    我有下面的代码,运行良好:

      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());
        }
    

    问题:我希望“conditionmentdecorator”的所有子类都强制重写getdescription()function,因为我已经在“conditionmentdecorator”类中编写了以下代码:

     public abstract string getDescription();
    

    但这改变了我当前的功能,并没有给出期望的结果,它只显示了“未知饮料”作为getDescription()的值,而getDescription()是大多数父类的值。

    正常结果:

    DarkRoast, Mocha, Mocha, Whip : $2.6 
    

    使用“public abstract string getdescription()”后的结果:

    Unknown beverage : $2.6 
    

    请建议我应该编写/更改什么,这样我就可以强制“conditionmentDecorator”的子类重写“getDescription();”,并在没有它的情况下得到resutl。

    3 回复  |  直到 15 年前
        1
  •  3
  •   Isak Savo    15 年前

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

    这个怎么样:

    我建议您创建一个接口, IBeverage 你在所有可饮用的东西上都能实现。然后你为“基本”饮料创造了一个基础类——黑烤肉、浓缩咖啡、室内混合饮料——就像你现在做的那样。

    对于调味品,可以实现实现IBeverage的新抽象基类,但不提供默认值 GetDescription 实施。这个类还可以在其构造函数中使用IBeverage来强制其他调味品执行相同的操作。

    我认为这样的方法应该有效(未经测试,未编译-但你知道这个主意)

    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";
      }
    }
    
        2
  •  1
  •   Euphoric    15 年前

    快速谷歌发现了这一点: http://codebetter.com/blogs/darrell.norton/archive/2005/05/18/63332.aspx

    我没有尝试代码本身。

        3
  •  0
  •   testalino    15 年前

    您可以创建这样的新方法:

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

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