我已经得到了下面的代码,它运行良好:
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());
}问题:我希望"condimentDecorator“的所有子类都强制覆盖getDescription()函数,为此我在"condimentDecorator”类中编写了以下代码:
public abstract string getDescription();但这改变了我当前的功能,并没有给出预期的结果,它只是将“未知饮料”显示为getDescription()的值,这是父类的值。
正常结果:
DarkRoast, Mocha, Mocha, Whip : $2.6 使用“公共抽象字符串getDescription()”后的结果:
Unknown beverage : $2.6 请建议我应该写什么/修改什么,这样我就可以强制"condimentDecorator“的子类覆盖"getDescription();”,并且在没有它的情况下也会得到resutl。
发布于 2010-10-01 15:38:17
我认为您的类层次结构需要重新考虑一下。
这个怎么样:
我的建议是创建一个接口,IBeverage,它可以在任何可以饮用的东西上实现。然后,您可以为“基础”饮料创建一个基类- DarkRoast、Espresso、HouseBlend -就像您现在所做的那样。
对于调味品,您实现了一个新的抽象基类,实现了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";
}
}发布于 2010-10-01 15:44:31
谷歌很快就找到了这个:http://codebetter.com/blogs/darrell.norton/archive/2005/05/18/63332.aspx
我没有尝试代码本身。
发布于 2010-10-01 15:29:36
您可以创建一个新方法,如下所示:
public abstract class condimentDecorator : Beverage
{
public override string getDescription()
{
return getDescriptionInternal();
}
protected abstract string getDescriptionInternal();
}这样,所有类都必须间接实现getDescription。
https://stackoverflow.com/questions/3837165
复制相似问题