帮忙看看错在哪里...希望能详细解答一下...

TimLeaf 2009-02-08 12:46:45
head first 设计模式这本书...
练习装饰者模式代码的时候,出现了问题...希望大家帮忙看一下...
这是类图:

以下是我的代码:
Beverage.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DecoratorPattern
{
public abstract class Beverage
{
private String _description;
public String Description
{
set { _description = value; }
get { return _description; }
}

public abstract Single Cost();
}
}

CondimentDecorate.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DecoratorPattern
{
public abstract class CondimentDecorate : Beverage
{
public override Single Cost()
{
return 0.0f;
}
}
}

DarkRoast.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DecoratorPattern
{
public class DarkRoast : Beverage
{
public DarkRoast()
{
Description = "Dark Roast Coffee";
}

public override Single Cost()
{
return 0.99f;
}
}
}

Decaf.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DecoratorPattern
{
public class Decaf : Beverage
{
public Decaf()
{
Description = "Decaf";
}

public override Single Cost()
{
return 1.05f;
}
}
}

Espresso.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DecoratorPattern
{
public class Espresso : Beverage
{
public Espresso()
{
Description = "Espresso";
}

public override Single Cost()
{
return 1.99f;
}
}
}

HouseBlend.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DecoratorPattern
{
public class HouseBlend : Beverage
{
public HouseBlend()
{
Description = "House Blend Coffee";
}

public override Single Cost()
{
return 0.89f;
}
}
}

Milk.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DecoratorPattern
{
public class Milk : CondimentDecorate
{
private Beverage _beverage;

public Milk(Beverage beverage)
{
_beverage = beverage;
_beverage.Description = _beverage.Description + ", Milk";
}

public override Single Cost()
{
return _beverage.Cost() + 0.10f;
}
}
}

Mocha.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DecoratorPattern
{
public class Mocha : CondimentDecorate
{
private Beverage _beverage;

public Mocha(Beverage beverage)
{
_beverage = beverage;
_beverage.Description = _beverage.Description + ", Mocha";
}

public override Single Cost()
{
return _beverage.Cost() + 0.2f;
}
}
}

Soy.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DecoratorPattern
{
public class Soy : CondimentDecorate
{
private Beverage _beverage;

public Soy(Beverage beverage)
{
_beverage = beverage;
_beverage.Description = _beverage.Description + ", Soy";
}

public override Single Cost()
{
return _beverage.Cost() + 0.15f;
}
}
}

以下是测试类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DecoratorPattern
{
class Program
{
static void Main(string[] args)
{
Beverage beverage1 = new HouseBlend();
Console.WriteLine(beverage1.Description + "$" + beverage1.Cost());

Beverage beverage2 = new Espresso();
beverage2 = new Soy(beverage2);
beverage2 = new Mocha(beverage2);
beverage2 = new Milk(beverage2);
Console.WriteLine(beverage2.Description + "$" + beverage2.Cost());

Beverage beverage3 = new DarkRoast();
beverage3 = new Milk(beverage3);
Console.WriteLine(beverage3.Description + "$" + beverage3.Cost());
beverage3 = new Milk(beverage3);
Console.WriteLine(beverage3.Description + "$" + beverage3.Cost());
beverage3 = new Milk(beverage3);
Console.WriteLine(beverage3.Description + "$" + beverage3.Cost());

Console.ReadKey();
}
}
}


在执行到beverage2 = new Mocha(beverage2);
beverage2.Description 的值就是null...
...全文
193 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
readfuture 2009-02-12
  • 打赏
  • 举报
回复
帮顶
悔说话的哑巴 2009-02-12
  • 打赏
  • 举报
回复
好多哦。。。
泡面之夏 2009-02-11
  • 打赏
  • 举报
回复
关注,UP
lyymax 2009-02-11
  • 打赏
  • 举报
回复
beverage2 = new Mocha(beverage2);
[1] [2]
这里面2号的beverage其实是Soy类型的。
所以在new Mocha()里面的代码其实是操所Soy::Description;
而你Soy的构造函数只是在操作别人的Description,并没有对自己的Description进行初始化。
erytbc 2009-02-10
  • 打赏
  • 举报
回复
yun
rightyeah 2009-02-10
  • 打赏
  • 举报
回复
路过
step_123 2009-02-10
  • 打赏
  • 举报
回复
关注
tigerleq 2009-02-10
  • 打赏
  • 举报
回复
日他的
看昏了
tigerleq 2009-02-10
  • 打赏
  • 举报
回复
Beverage beverage2 = new Espresso();
没有Description
这个属性
当然为空3
pbmlly 2009-02-09
  • 打赏
  • 举报
回复
眼花缭乱.......
perisonchen 2009-02-09
  • 打赏
  • 举报
回复
标记记号,回家慢慢看...
空心兜兜 2009-02-08
  • 打赏
  • 举报
回复
被图吸引了...
king19840811 2009-02-08
  • 打赏
  • 举报
回复
mark
ws_hgo 2009-02-08
  • 打赏
  • 举报
回复
关注...
claymore1114 2009-02-08
  • 打赏
  • 举报
回复
花眼了 先UP
TimLeaf 2009-02-08
  • 打赏
  • 举报
回复
TimLeaf 2009-02-08
  • 打赏
  • 举报
回复
那继续上图...
这是书上的部分代码...





JeffrySun 2009-02-08
  • 打赏
  • 举报
回复
beverage2 = new Soy(beverage2);


这句有问题, 浏览了一眼lz的代码, 发现类继承层次上来说, 这个new有点问题,lz再开看

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧