C#实现装饰器模式(Decorator pattern)报构造参数缺失问题咨询
问题原因与修复方案
报错原因
- 直接触发报错的原因:
EnhancedAutoPilot类仅声明了一个接收Car类型参数的构造函数,你在Main方法中执行new EnhancedAutoPilot()时没有传入对应参数,不符合构造函数的参数要求。 - 同时存在两处隐藏问题:
- 装饰器模式要求必须有一个未被装饰的基础核心对象作为最内层实例,不能直接将装饰器作为最内层对象实例化。
ModelXS、ModelXXX两个基础Car子类的逻辑错误:类中多余定义了未初始化的_decorated字段,且Descripton属性直接返回_decorated.Descripton,后续运行会触发空引用异常。
修复步骤
1. 修正基础Car子类逻辑
删除ModelXS、ModelXXX中多余的_decorated字段,调整Descripton属性的返回值:
public class ModelXS:Car { public override string Descripton { get { return "Model XS"; } } public override int Cost() { return 5500; } }
public class ModelXXX : Car { public override string Descripton { get { return "ModelXXX"; } } public override int Cost() { return 73000; } }
2. 调整Main方法的实例化逻辑
在最内层EnhancedAutoPilot的构造函数中传入基础Car实例:
class Program { static void Main(string[] args) { // 最内层传入基础ModelXS实例,再逐层用装饰器包裹 Car car = new RearFacingSeats(new SmartAirSuspension(new EnhancedAutoPilot(new ModelXS()))); // 测试输出可正常得到结果 Console.WriteLine(car.Descripton); Console.WriteLine(car.Cost()); } }
可选优化
当前代码中属性名Descripton存在拼写错误,建议修正为标准命名Description,降低后续维护成本。
内容的提问来源于stack exchange,提问作者mightycode Newton
相关产品推荐
相关产品推荐

