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

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类中声明了该字段,所以装饰器会保存相同数据的副本,最终浪费内存。

===============>>#1 票数: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) { }
}

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

===============>>#2 票数: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) { }
}

  ask by atoMerz translate from so

未解决问题?本站智能推荐: