我只是想知道,我目前正在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中设置它。这可能吗?
答案 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();
}