Шаблон декоратора тратит память - PullRequest
1 голос
/ 11 декабря 2011

У меня есть этот базовый класс, имеющий следующий интерфейс:

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

Для любых производных классов значение Val должно быть указано во время создания объекта.
Вопрос в том, как я могу сделать производным классом, чтобы сделать это (надеюсь, во время компиляции)?
Я попытался добавить конструктор:

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

  private object val;

  ...
}

Но, как вы можете видеть тогдаМне пришлось объявить приватное поле для хранения значения в нем (поскольку Value доступно только для чтения).
Проблема возникает из-за того, что я хочу добавить какой-то эффект к производным классам, используя шаблон Decorator / Wrapper, представленный в шаблонах GoF Design Patterns.,Но так как я объявил поле внутри базового класса, декораторы продолжают сохранять копию тех же данных, и я теряю память.

Ответы [ 2 ]

2 голосов
/ 11 декабря 2011

Попробуйте вместо этого:

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) { }
}
2 голосов
/ 11 декабря 2011

Если это декоратор, тогда нет поля:

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) { }
}

Здесь базовый класс может даже обрабатывать хранилище и т. Д.

...