Zai*_*ikh 10 c# abstract-class
在抽象类中使用构造函数是否很好?
创建抽象类的构造函数是一种很好的编程习惯吗?由于无法初始化抽象类,因此初始化了它们的子类.
以下是我的班级结构.
public abstract class Scheduler
{
private Storyboard timer;
protected Scheduler()
{
// initialize the timer here.
timer = new Storyboard();
this.PollInterval = 60;
}
}
public class TaskScheduler : Scheduler
{
public TaskScheduler()
: base()
{
}
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 13
是的,这绝对没问题.仅仅因为构造函数只能由派生类调用并不意味着它不会有用.例如,您可能有一个表示某种命名实体的抽象类 - 将该名称作为构造函数参数是有意义的.
可能值得使构造函数受到保护,使得更明显的是你不能从其他地方调用它.
请注意,抽象类中有构造函数(或多个构造函数)会强制派生类构造函数通过它,但它不会强制派生类具有相同的构造函数签名.例如:
public abstract class NamedFoo
{
private readonly string name;
public string Name { get { return name; } }
protected NamedFoo(string name)
{
this.name = name;
}
}
public class DerivedFooWithConstantName
{
public DerivedFooWithConstantName() : base("constant name")
{
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,派生类构造函数"移除"一个参数(通过提供一个常量值作为抽象类构造函数的参数),但在其他情况下,它可以"添加"它所需的参数,或者具有混合.
绝对没有理由不在抽象基类中使用构造函数.
抽象类被初始化并且像任何其他类一样工作.该abstract关键字只有做到以下几点:
它可以防止类本身直接实例化.它只能通过实例化一个继承的类来实例化.与非抽象基类相比,这不会改变初始化的行为;
它允许您在类中拥有抽象方法,属性和事件.
如果您没有抽象方法,属性或事件,则可以通过创建类的构造函数protected(就像您所做的那样)来完成相同的结果.这也可以防止类直接实例化.但与抽象类相比,行为不会改变.
然后,主要区别在于将方法,属性和事件声明为抽象的能力,只有在标记类时才能执行abstract.