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

时间:2010-11-07 08:25:31

标签: 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()
    {

    }
}

4 个答案:

答案 0 :(得分: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")
    {
    }
}

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

答案 1 :(得分:5)

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

抽象类已初始化,其工作方式与其他类一样。 abstract关键字仅执行以下操作:

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

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

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

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

答案 2 :(得分:1)

在抽象类中使用构造函数有时很有用。这个问题是重复的,在相关的帖子中处理得很多。尽管它特别引用了JAVA,但从概念上讲它也适用于C#。

Can an abstract class have a constructor?

答案 3 :(得分:0)

抽象类型的构造函数只能由派生类型调用。因为公共构造函数创建类型的实例,并且您无法创建抽象类型的实例,所以具有公共构造函数的抽象类型设计不正确。 CA1012: Abstract types should not have constructors

通过将构造函数的可访问性从公共更改为受保护来修复违规。

示例:

namespace Sample  
{        
    public abstract class Book      
    {          
        protected Book()           
        {          
        }      
    } 
}