首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我在中间类中使用抽象关键字时,代码无法工作

当我在中间类中使用抽象关键字时,代码无法工作
EN

Stack Overflow用户
提问于 2010-10-01 15:15:10
回答 3查看 185关注 0票数 0

我已经得到了下面的代码,它运行良好:

代码语言:javascript
复制
  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();
    }
}

我是这样使用它的:

代码语言:javascript
复制
 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());
    }

问题:我希望"condimentDecorator“的所有子类都强制覆盖getDescription()函数,为此我在"condimentDecorator”类中编写了以下代码:

代码语言:javascript
复制
 public abstract string getDescription();

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

正常结果:

代码语言:javascript
复制
DarkRoast, Mocha, Mocha, Whip : $2.6 

使用“公共抽象字符串getDescription()”后的结果:

代码语言:javascript
复制
Unknown beverage : $2.6 

请建议我应该写什么/修改什么,这样我就可以强制"condimentDecorator“的子类覆盖"getDescription();”,并且在没有它的情况下也会得到resutl。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-01 15:38:17

我认为您的类层次结构需要重新考虑一下。

这个怎么样:

我的建议是创建一个接口,IBeverage,它可以在任何可以饮用的东西上实现。然后,您可以为“基础”饮料创建一个基类- DarkRoast、Espresso、HouseBlend -就像您现在所做的那样。

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

我认为像这样的东西应该可以工作(未经测试,未编译--但你明白我的想法)

代码语言:javascript
复制
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";
  }
}
票数 3
EN

Stack Overflow用户

发布于 2010-10-01 15:44:31

谷歌很快就找到了这个:http://codebetter.com/blogs/darrell.norton/archive/2005/05/18/63332.aspx

我没有尝试代码本身。

票数 1
EN

Stack Overflow用户

发布于 2010-10-01 15:29:36

您可以创建一个新方法,如下所示:

代码语言:javascript
复制
public abstract class condimentDecorator : Beverage
{
     public override string getDescription()
     {
          return getDescriptionInternal();
     }
     protected abstract string getDescriptionInternal();
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3837165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档