在抽象类中使用构造函数是否很好?

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)

在这种情况下,派生类构造函数"移除"一个参数(通过提供一个常量值作为抽象类构造函数的参数),但在其他情况下,它可以"添加"它所需的参数,或者具有混合.


Pie*_*kel 5

绝对没有理由不在抽象基类中使用构造函数.

抽象类被初始化并且像任何其他类一样工作.该abstract关键字只有做到以下几点:

  • 它可以防止类本身直接实例化.它只能通过实例化一个继承的类来实例化.与非抽象基类相比,这不会改变初始化的行为;

  • 它允许您在类中拥有抽象方法,属性和事件.

如果您没有抽象方法,属性或事件,则可以通过创建类的构造函数protected(就像您所做的那样)来完成相同的结果.这也可以防止类直接实例化.但与抽象类相比,行为不会改变.

然后,主要区别在于将方法,属性和事件声明为抽象的能力,只有在标记类时才能执行abstract.