派生 class 中的构造函数是否也可以在基础 class 构造函数中触发代码?

Is it possible to have a constructor in a derived class also fire code in the base class' constructor?

我只是想知道,我目前正在用 C# 为博客网站编写数据模型,并且我正在使用派生的 classes。但烦人的是,我必须在派生的 class' 构造函数中初始化基础 class' 字段,如下所示:

public class baseClass
{
  public dateTime dateCreated { get; protected set; } //only protected because that's what I need...
}

public class derivedClas : baseClass
{
  public derivedClass
  {
    this.dateCreated = DateTime.Now;
  }
}

所以我想做的不是在派生 class 中手动设置字段,而是想在创建 derivedClass 的新实例时自动在 baseClass 中设置它。这可能吗?

如果您在基础 class 中实现一个构造函数,该构造函数与您的派生 class 具有匹配的签名(相同的参数类型),将自动调用基础构造函数。

public class BaseClass
{
    public DateTime DateCreated { get; protected set; } //only protected because that's what I need...

    public BaseClass()
    {
        DateCreated = DateTime.Now;
    }

}

public class DerivedClass : BaseClass
{
    public DerivedClass()
    {
    }
}

这是您希望实现的目标吗?

void Main()
{
    var i = new B();
    i.Time.Dump();
}

// Define other methods and classes here
public class A
{
    public A()
    {
        Time = DateTime.Now;
    }
    public DateTime Time {get;set;}
}

public class B : A
{
    public B() : base()
    {

    }
}

这应该可以解决您的问题:

public class baseClass
{
  public dateTime dateCreated { get; protected set; } 
  protected baseClass() {
    dateCreated = DateTime.Now;
  }
}

public class derivedClas : baseClass
{
  public derivedClass() : base()
  {
   //Do some constructor stuff for derivedClass if needed
  }
}

这将在派生 class 中的构造函数之前调用基 class 中的构造函数。

或者如果您只想为您的日期设置默认值,您可以这样做:

public class baseClass
{
  private DateTime _date = DateTime.Now;
  public DateTime dateCreated { get {return _date;} protected set { _date = value;} } 

}

应该设置实例化派生 class 的日期。

不幸的是,DateTime.Now 不是编译时常量,否则我们可以在此处将其用作默认值。相反,我们不需要在基础 class 中使用自动实现的 属性。这让我们的字段实际上是一个可以为 null 的类型,所以我们可以通过检查它的值来初始化它而不需要 NullReferenceException.

 public class BaseClass
    {      
      private DateTime? _dc;  //notice, it's nullable
      public DateTime DateCreated 
          {
              get 
              {
                 if(_dc == null)
                    _dc = InitDate();
                 return (DateTime)_dc;
              }
              set
              { _dc = value; }

          }
       private static DateTime InitDate()
       { return DateTime.Now; }
  }

  public class DerivedClass : BaseClass
  {
      public DerivedClass
      {           
      }
  }

如果您不介意默认值等同于 DateTime.MinValue,您可以使用默认参数。

    public class BaseClass
    {
        public DateTime DateCreated { get; set; } = new DateTime();

    }