派生 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();
}
我只是想知道,我目前正在用 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();
}