首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bootstrapping初始化

Bootstrapping初始化
EN

Stack Overflow用户
提问于 2012-06-21 04:43:31
回答 3查看 105关注 0票数 0

我有两个类,一个继承自另一个。基类是MustInherit/抽象,并定义了一个MustOverride/抽象属性。

作为基类初始化的一部分,它根据抽象属性的值设置一个变量。问题是继承类接受应该分配给覆盖属性的值作为它的参数。继承的类设置此属性,但不是在调用基类的初始值设定项之前。

基本上,我需要初始化基类的一部分,然后允许继承类初始化它的一些属性,然后返回基类以完成对更多属性的初始化。

我会让属性成为基类的一部分,但是继承类使用强类型,而基类只需要一个接口。

代码示例:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-21 05:04:13

正是由于这个原因,不应该在构造函数中调用抽象成员。http://msdn.microsoft.com/en-us/library/ms182331(v=vs.100).aspx

如果您可以控制抽象类,我建议通过基类构造函数传入该值。

代码语言:javascript
复制
public abstract class A
{
    public A(IExample x)
    {
        // Do Stuff
        var _privateY = x.Foo();
    }
}

public class B : A
{
    public B(IExample x):base(x)    {}
}
票数 3
EN

Stack Overflow用户

发布于 2012-06-21 05:08:21

编辑:对不起,我的答案在C#中:(

一种选择是让基抽象类调用子类可以实现的虚拟(或抽象)初始化方法:

代码语言:javascript
复制
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并分配数据:

代码语言:javascript
复制
public class B : A
{
    public override IExample X { get; set; }

    public B()
    {

    }

    protected override void PreInit()
    {
        X = new ConcreteExample();
    }
}
票数 1
EN

Stack Overflow用户

发布于 2012-06-21 04:52:08

您可以使用Lazy<T>

代码语言:javascript
复制
public abstract class A
{
    private Lazy<IExample> _privateY = new Lazy(() => this.X.Foo());
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11127879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档