尝试从"Head First Design pattern“一书(用Java语言编写)中的代码用C#实现装饰器模式。
我刚开始使用C#,因此对语法还很陌生,所以我不确定为什么我不能让下面的注释代码行工作。
以下是Decorator模式中的第一个抽象基类及其派生类:
using System;
public abstract class Beverage
{
private String m_description;
// get a description of the beverage
public virtual String Description { get { return m_description; } }
// calculate cost of the beverage
public abstract double Cost();
}
// HouseBlend coffee implements Beverage
public class HouseBlend : Beverage
{
// Constructor
public HouseBlend() { m_description = "House Blend"; }
// calculate base cost of House Blend
public override double Cost() { return 0.89; }
}
// DarkRoast coffee implements Beverage
public class DarkRoast : Beverage
{
// Constructor
public DarkRoast() { m_description = "Dark Roast"; }
// calculate base cost of Dark Roast
public override double Cost() { return 1.00; }
}
// Espresso coffee implements Beverage
public class Espresso : Beverage
{
// Constructor
public Espresso() { m_description = "Espresso"; }
// calculate base cost of Espresso
public override double Cost() { return 1.99; }
}有问题的代码在Mocha类的Cost()方法中:
using System;
// abstract base class CondimentDecorator is-a Beverage
public abstract class CondimentDecorator : Beverage {}
// Mocha implements the CondimentDecorater
public class Mocha : CondimentDecorator
{
// Condiment decorator has-a Beverage (recursion!)
private Beverage m_beverage;
// Constructor binds the object passed to member var
public Mocha(Beverage beverage)
{
this.m_beverage = beverage;
}
// getter implements abstract class Description
public override String Description
{
get
{
return m_beverage.Description + ", Mocha";
}
}
// get the Cost of the condiment plus the base-cost
// of the original beverage
public new double Cost() // ERROR: 'Mocha.Cost()' hides inherited
{ // member 'Beverage.Cost()'
return 0.20 + m_beverage.Cost();
}
}发布于 2012-01-22 14:06:46
将new更改为override。另外,m_description应该是protected。
发布于 2012-01-22 14:09:43
您已将Mocha的Cost()方法声明为new,而不是override。不同之处在这里:http://blogs.msdn.com/b/csharpfaq/archive/2004/03/12/what-s-the-difference-between-code-override-code-and-code-new-code.aspx
发布于 2013-02-16 22:06:03
这就是你的代码应该是什么样子。
public abstract class Beverage
{
protected string m_description = "Unknown Beverage";
public virtual string GetDescription()
{
return m_description;
}
public abstract double Cost();
}
public abstract class CondimentDecorator : Beverage
{
}
public class Espresso : Beverage
{
public Espresso()
{
m_description = "Espresso";
}
public override double Cost()
{
return 1.99;
}
}
public class HouseBlend : Beverage
{
public HouseBlend()
{
m_description = "House Blend Coffe";
}
public override double Cost()
{
return 0.89;
}
}
public class DarkRoast : Beverage
{
public DarkRoast()
{
m_description = "Dark Roast";
}
public override double Cost()
{
return 0.99;
}
}
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 0.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 0.15 + 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 0.10 + beverage.Cost();
}
}https://stackoverflow.com/questions/8959346
复制相似问题