众所周知,在 C# 中,基类构造函数总是在继承类构造函数之前调用。因此,我面临一个问题,我找不到解决方法:
有一个基类
public class BaseClass
{
public IValuesProvider ValuesProvider {get; protected set; }
public virtual IList<Value> Values
{
get {return ValuesProvider.GetAll(); }
}
public BaseClass(IValuesProvider valuesProvider)
{
ValuesProvider = valuesProvider;
Load();
}
public virtual void Load()
{
foreach (var value in Values)
{
// DO something with value
}
}
}
和一个继承的类
public class InheritedClass : BaseClass
{
public int? Filter {get; protected set;}
public override IList<Value> Values
{
get {return base.Values.Where(v => v.Id > Filter); }
}
public InheritedClass (IValuesProvider valuesProvider, int filter)
: base (valuesProvider)
{
Filter = filter;
}
}
如果我实例化 InheritedClass,我将在尝试返回值时在 Filter 上获得 Null 引用异常。所以我需要在分配“过滤器”时执行 Load() 并且只执行一次。我在我的约束中添加了 InheritedClass 也可以被继承,例如:
public class InheritedClass2 : InheritedClass
{
public int? Filter2 {get; protected set;}
public override IList<Value> Values
{
get {return base.Values.Where(v => v.Id > Filter2); }
}
public InheritedClass2 (IValuesProvider valuesProvider, int filter1, int filter 2)
: base (valuesProvider, filter1)
{
Filter2 = filter2;
}
}
如何在不编写脏代码的情况下有效地调用 Load ?