我有两个类,一个继承自另一个。基类是MustInherit/抽象,并定义了一个MustOverride/抽象属性。
作为基类初始化的一部分,它根据抽象属性的值设置一个变量。问题是继承类接受应该分配给覆盖属性的值作为它的参数。继承的类设置此属性,但不是在调用基类的初始值设定项之前。
基本上,我需要初始化基类的一部分,然后允许继承类初始化它的一些属性,然后返回基类以完成对更多属性的初始化。
我会让属性成为基类的一部分,但是继承类使用强类型,而基类只需要一个接口。
代码示例:
MustInherit Class A
MustOverride Property X As IExample
Sub New()
' Do some stuff
_privateY = X.Foo() ' NullReferenceException
End Sub
End Class
Class B
Inherits A
Override Property X As IExample ' returns StrongX
Property StrongX As ConcreteExample ' ConcreteExample implements IExample
Sub New(x As ConcreteExample)
MyBase.New(x)
StrongX = x
End Sub
End Class发布于 2012-06-21 05:04:13
正是由于这个原因,不应该在构造函数中调用抽象成员。http://msdn.microsoft.com/en-us/library/ms182331(v=vs.100).aspx
如果您可以控制抽象类,我建议通过基类构造函数传入该值。
public abstract class A
{
public A(IExample x)
{
// Do Stuff
var _privateY = x.Foo();
}
}
public class B : A
{
public B(IExample x):base(x) {}
}发布于 2012-06-21 05:08:21
编辑:对不起,我的答案在C#中:(
一种选择是让基抽象类调用子类可以实现的虚拟(或抽象)初始化方法:
public abstract class A
{
public abstract IExample X { get; set; }
private object _privateY;
protected A()
{
PreInit();
PostInit();
}
protected abstract void PreInit();
protected virtual void PostInit()
{
if (X == null)
throw new InvalidOperationException("Must assign a value to X.");
_privateY = X.Foo();
}
}然后在B中,覆盖PreInit并分配数据:
public class B : A
{
public override IExample X { get; set; }
public B()
{
}
protected override void PreInit()
{
X = new ConcreteExample();
}
}发布于 2012-06-21 04:52:08
您可以使用Lazy<T>
public abstract class A
{
private Lazy<IExample> _privateY = new Lazy(() => this.X.Foo());
}https://stackoverflow.com/questions/11127879
复制相似问题