是否有可能在派生类中有一个构造函数也可以在基类中触发代码'构造函数?

时间:2017-01-10 18:17:41

标签: c# constructor data-manipulation derived-class base-class

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

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;
  }
}

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

4 个答案:

答案 0 :(得分:0)

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

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()
    {
    }
}

答案 1 :(得分:0)

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

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()
    {

    }
}

答案 2 :(得分:0)

这应该适合你:

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
  }
}

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

或者,如果您只想要日期的默认值,则可以执行以下操作:

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

}

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

答案 3 :(得分:0)

不幸的是,DateTime.Now不是编译时常量,或者我们可以在这里使用它作为默认值。相反,我们不需要在基类中使用自动实现的属性。这使得我们的字段实际上是一个可以为空的类型,因此我们可以在没有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();

    }