我有这个基类有以下接口:
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类中声明了这个字段,所以装饰器不断保存相同数据的副本,最终浪费了内存。
答案 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) { }
}