【发布时间】:2011-02-21 23:25:28
【问题描述】:
public class Car
{
private string make;
private string model;
public Car(string make, string model)
{
this.make = make;
this.model = model;
}
public virtual void Display()
{
Console.WriteLine("Make: {0}", make);
Console.WriteLine("Model: {0}", model);
}
public string Make
{
get{return make;}
set{make = value;}
}
public string Model
{
get{return model;}
set{model = value;}
}
}
public class SuperCar:Car
{
private Car car;
private int horsePower;
public SuperCar(Car car)
{
this.car = car;
}
public int HorsePower
{
get{return horsePower;}
set{horsepower = value;}
}
public override void Display()
{
base.Display();
Console.WriteLine("I am a super car");
}
当我做类似的事情时
Car myCar = new Car("Porsche", "911");
SuperCar mySupcar = new SuperCar(myCar);
mySupcar.Display();
我只得到“我是一辆超级跑车”,但没有得到我的基类的属性。我应该在 SuperCar 构造函数中明确分配我的基类的属性吗?事实上,我正在尝试装饰器模式,我希望一个类向基类添加行为。
【问题讨论】:
-
为了让 Supercar 成为真正的装饰者,请将 Car 的所有方法委托给您的包裹汽车。如果 Decorator 是正确的模式,这是值得怀疑的,尤其是当您处理具体的类时。
-
假设您将 Car 重命名为 Container 并将 SuperCar 重命名为 Box。你说“盒子是一种容器(因为它继承自容器),每个盒子都包含一个容器(因为它在其构造函数中接受一个容器并将其保存在一个字段中)”。这真的是你想要建模的吗?为什么一个盒子应该包含一个容器?为什么 SuperCar 既包含 Car 又是 Car 的一种?
标签: c# design-patterns inheritance decorator