public abstract class Beverage
{
protected string description = "Unknown Beverage"; public string GetDescription()
{
return description;
} public abstract double Cost();
} public abstract class CondimentDecorator:Beverage
{
protected Beverage Beverage;
public abstract string GetDescription();
} public class Mocha:CondimentDecorator
{
public Mocha(Beverage beverage)
{
this.Beverage = beverage;
} public override string GetDescription()
{
return Beverage.GetDescription() + ",Mocha";
} public override double Cost()
{
return .20 + Beverage.Cost();
}
}
Beverage beverage2=new HouseBlend();
beverage2=new Mocha(beverage2);
beverage2.GetDescription();
{
protected string description = "Unknown Beverage"; public string GetDescription()
{
return description;
} public abstract double Cost();
} public abstract class CondimentDecorator:Beverage
{
protected Beverage Beverage;
public abstract string GetDescription();
} public class Mocha:CondimentDecorator
{
public Mocha(Beverage beverage)
{
this.Beverage = beverage;
} public override string GetDescription()
{
return Beverage.GetDescription() + ",Mocha";
} public override double Cost()
{
return .20 + Beverage.Cost();
}
}
Beverage beverage2=new HouseBlend();
beverage2=new Mocha(beverage2);
beverage2.GetDescription();
{
return description;
}没有用virtual,那就有两个GetDescription(),要竞争上岗啦
回去好好看看基础书,抽象类里能不能有方法,可不可以加virtual。
public abstract class Beverage
{
protected string description = "Unknown Beverage"; public string GetDescription() //基类里面有了此方法
{
return description;
} public abstract double Cost();
} public abstract class CondimentDecorator:Beverage
{
protected Beverage Beverage;
public abstract string GetDescription(); //继承的子类里面有同名的方法,而且没有标记override,这时就要根据变量实例的定义来决定执行哪个方法了。
}
使用virtual关键字后,子类的实现实际上实现的是对基类GetDescription的重写,而不是对中间的抽象方法重写(不过估计这样编译不过去)。