head first 设计模式这本书...
练习装饰者模式代码的时候,出现了问题...希望大家帮忙看一下...
这是类图:以下是我的代码:
Beverage.csusing 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.csusing 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.csusing 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.csusing 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.csusing 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.csusing 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.csusing 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.csusing 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.csusing 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...

解决方案 »

  1.   

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

  2.   

    Beverage beverage2 = new Espresso();
    没有Description 
    这个属性
    当然为空3
      

  3.   

    beverage2 = new Mocha(beverage2); 
    [1]                   [2]
    这里面2号的beverage其实是Soy类型的。
    所以在new Mocha()里面的代码其实是操所Soy::Description;
    而你Soy的构造函数只是在操作别人的Description,并没有对自己的Description进行初始化。