我有这样一个抽象类:
public abstract class Beverage
{
public string description = "Unkown Beverage"; public string getDescription()
{
return this.description;
} public abstract double cost();
}
一个装饰类:
public abstract class CondimentDecorator:Beverage
{
public abstract string getDescription();
}
一个Beverage的子类:
public class HouseBlend:Beverage
{
public HouseBlend()
{
description = "House Blend Coffee";
} public override double cost()
{
return 0.89;
}
}
一个CondimentDecorator的子类
public class Mocha:CondimentDecorator
{
Beverage bev;
public Mocha(Beverage bever)
{
this.bev = bever;
} public override string getDescription()
{
return this.bev.getDescription()+",Mocha";
}
public override double cost()
{
return this.bev.cost()+0.20;
}
}
运行文件:
static void Main(string[] args)
{
Beverage bev2 = new HouseBlend();
bev2 = new Mocha(bev2);
Console.WriteLine(bev2.getDescription()+" $"+bev2.cost());
Console.ReadLine();
}
运行结果应该是:House Blend Coffee,Mocha $1.09
现在显示为:Unkown Beverage $1.09
这个getDescription没有起装饰作用,请问这是怎么回事???
谢谢!!!
public abstract class Beverage
{
public string description = "Unkown Beverage"; public string getDescription()
{
return this.description;
} public abstract double cost();
}
一个装饰类:
public abstract class CondimentDecorator:Beverage
{
public abstract string getDescription();
}
一个Beverage的子类:
public class HouseBlend:Beverage
{
public HouseBlend()
{
description = "House Blend Coffee";
} public override double cost()
{
return 0.89;
}
}
一个CondimentDecorator的子类
public class Mocha:CondimentDecorator
{
Beverage bev;
public Mocha(Beverage bever)
{
this.bev = bever;
} public override string getDescription()
{
return this.bev.getDescription()+",Mocha";
}
public override double cost()
{
return this.bev.cost()+0.20;
}
}
运行文件:
static void Main(string[] args)
{
Beverage bev2 = new HouseBlend();
bev2 = new Mocha(bev2);
Console.WriteLine(bev2.getDescription()+" $"+bev2.cost());
Console.ReadLine();
}
运行结果应该是:House Blend Coffee,Mocha $1.09
现在显示为:Unkown Beverage $1.09
这个getDescription没有起装饰作用,请问这是怎么回事???
谢谢!!!
解决方案 »
- 去除字符中的所有空格
- 用过vs2008的来回答。高分送你
- 就要辞职走人了,送分
- 在Orcale过程中,生成了动态的insert 语句:Sql_insert:='insert into '|| srctable || '('||fielda,filedb||')'|| ' values( '|| a,b ||')
- 初学者关于sql数据库连接的问题,请大家帮我解答
- 还是关于web图形问题???
- 有没有ASP.NET实现工作流的思路或者文章?
- NET 如何将上传的俩个图片拼成一个图片
- 菜鸟做一个查询的例子,问题多多,麻烦大家帮我看一下!!!谢谢
- 這樣連sql不上,有問題嗎...請求幫助...
- 微软企业库在.net2.0里是不是不能用啊,编译时报'{xxx}ReadOnlyConfigurationSectionData'is not found in Schema
- asp.net中的C#控件问题,请高手指点一下,在线等!!
cription()”。如果是有意隐藏,请使用关键字 new。
Condim....类在Beve....类之外,定义了一个同名的方法,这是第一丑。将来这种混乱要害死人的。
Mocha形式上是从Beve...类继承的,同时又以一个Beve....类型的对象作为自己的属性,并且将所有操作委派为(偷换为)参数的操作,这是第二丑。两丑恰好组合在一起形成关联关系,产生了更大的丑。
设计模式是在面向对象设计早期,一些“大师”想用面向对象设计技术迎合传统结构化设计(他们认为继承会毁掉体系结构,需要尽量用组合来替代继承)的习惯,而开发出来的。其大多数内容以繁琐为美,以丑为美。
在饮料店中有很多种饮料(Beverage),比如咖啡(HouseBlend)...,又有很多种可以放入咖啡的调料(Condiment),这样就产生很多种组合,比如放奶的咖啡价钱是0.1+1,放糖的咖啡是0.05+1,而且放入的量还可能是几份,如果你为每一种组合生成一个类那么就有很多个类,这样到最后你就没法用了。通过装饰模式,你只需定义咖啡,然后定义一个装饰类,所有调料通过装饰类来继承:
Beverage bev3 = new HouseBlend(); // 定义一直咖啡
bev3 = new Soy(bev3); // 放入一种调料
bev3 = new Soy(bev3); // 再放入同意的调料
bev3 = new Whip(bev3); // 放入其他调料
Console.WriteLine(bev3.getDescription()+" $"+bev3.cost()); // 得到这种咖啡全面的描述和最后的价格我刚开始接触设计模式,以前只是根据自己的了解来重构代码,现在通过学习设计模式发现代码还可以这样写,它为我的工作和学习打开了令一扇门。sp1234谈的是一番过来人的感受,我很羡慕,希望我有一天也能达到他的高度!
上面只须改为
public abstract class Beverage
{
public string description = "Unkown Beverage";public virtual string getDescription()
{
return this.description;
}public abstract double cost();
}
和
public abstract class CondimentDecorator:Beverage
{
public override string getDescription()
{
return null;
}
}
就行了???