调用base()和this()构造函数

时间:2014-01-30 15:07:54

标签: c# inheritance constructor

我看起来并没有找到与我正在处理的相似的东西。希望是一个解决方案,或提供更好的实施。我有一个类可以传递一个可选参数,该参数保留给创建的实例。然后我有一个具有类似可选参数的派生类,但在其非参数构造函数中,无论可选参数如何,都会执行其他准备工作。让它调用基类参数构造函数的正确方法是什么,但仍然执行派生的非参数构造函数。

public class MyBaseClass
{
   protected object preserveParm;
   protected int someValue;

   public MyBaseClass()
   {
      someValue = 1;
   }

   public MyBaseClass( object SomeParm ) : this()
   {
      preserveParm = SomeParm;
   }
}

public class DerivedClass : MyBaseClass
{
   private int customSecondaryProp;
   private DateTime when;

   public DerivedClass()
   {
      customSecondaryProp = 10;
      someValue = 5;
   }

   public DerivedClass( object SomeParm ) : base( SomeParm )
   {
      when = DateTime.Now;
   }
}

所以,如果我做了

DerivedClass test = new DerivedClass( "testing" );

我需要它来命中基类来保存参数,但是还要点击派生类的非参数来设置样本伪值。

现在看来,Derived参数方法被命中,然后命中基类的参数构造函数,该参数构造函数调用基类的“this()”,并将链返回到DerivedClass参数构造函数,完成自身,但永远不会击中DerivedClass构造函数。有没有办法强制baseclass无参数和DerivedClass无参数构造函数?

3 个答案:

答案 0 :(得分:3)

看起来你想要这样的东西:

public DerivedClass( object SomeParm ) : base( SomeParm ), this()

但在C#中这是不可能的:see this answer for details 我建议你在方法中实现Derived构造函数初始化,并在两个构造函数中手动调用它:

public class DerivedClass : MyBaseClass
{
    private int customSecondaryProp;
    private DateTime when;

    private void InitializeDerivedClass()
    {
        customSecondaryProp = 10;
        someValue = 5;
    }

    public DerivedClass()
    {
        InitializeDerivedClass();
    }

    public DerivedClass(object SomeParm): base(SomeParm)
    {
        InitializeDerivedClass();
        when = DateTime.Now;
    }
}

如果可能,您还可以使用以下语法进行初始化:

    private int customSecondaryProp = 10;

答案 1 :(得分:0)

为什么不在这里使用可选参数来强制类型只有一个构造函数。

public DerivedClass(object SomeParam = null) : base(SomeParam) {
  customSecondaryProp = 10;
  someValue = 5;
  if (SomeParam != null) { 
    when = DateTime.Now;
  }
}

public MyBaseClass(object SomeParam) {
  someValue = 1;
  preserveParam = SomeParam;
}

答案 2 :(得分:0)

public DerivedClass():base(null)

您可以将Null发送到参数构造函数