装饰员模式浪费记忆

时间:2011-12-11 19:19:32

标签: c# design-patterns inheritance polymorphism decorator

我有这个基类有以下接口:

abstract class Base
{
  abstract public object Val
  {
    get;
  }
}

对于任何派生类,在对象创建时指定Val的值必须
问题是:我如何使派生类这样做(希望在编译时)? 我尝试添加一个构造函数:

abstract class Base
{
  public Base(object value)
  {
    val = value;
  }

  private object val;

  ...
}

但是你可以看到我必须声明一个私有字段来存储它的值(因为Value是只读的)。
问题出现是因为我想使用GoF设计模式中引入的Decorator / Wrapper模式为派生类添加某种效果。但是因为我已经在Base类中声明了这个字段,所以装饰器不断保存相同数据的副本,最终浪费了内存。

2 个答案:

答案 0 :(得分:2)

如果是装饰者,那么就没有字段:

public override object Val {
    // add any decoration effects here if needed
    get { return tail.Val; }
}

tail是你要装饰的东西。


然而,听起来你的意思是继承(不是装饰) - 如果是这样的话:

abstract class BaseClass {
    protected BaseClass(object val) {...}
}
class ConcreteType : BaseClass {
    public ConcreteType(object val)
        : base(val) { }
}

这里基类甚至可以处理存储等。

答案 1 :(得分:2)

请改为尝试:

abstract class Base 
{
    public Base(object val)
    {
        this.Val = val;
    }

    public object Val { get; private set; }
}

这样,派生类不需要自己的字段:

public class Derived : Base
{
    public Derived(object val) : base(val) { }
}