2010-11-07 76 views
10

在抽象类中有一个构造函数是否很好?在抽象类中有一个构造函数很好吗?

创建抽象类的构造函数是一种很好的编程习惯吗?由于抽象类不能被初始化,所以它们的子类被初始化。

以下是我的班级结构。

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() 
    { 

    } 
} 

回答

12

是的,这是绝对的罚款。仅仅因为构造函数只能被派生类调用,并不意味着它不会有用。例如,你可能有一个抽象类,它代表某种类型的命名实体 - 将该名称作为构造器参数是有意义的。

这可能是值得让构造函数受到保护,使它更明显,你不能只从别处调用它。

需要注意的是在那里的一个抽象类力派生类的构造函数要经过它的构造函数(或多个构造函数),但它强制派生类具有相同的构造函数签名。例如:

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") 
    { 
    } 
} 

在这种情况下,派生类构造函数“移除”的参数(通过提供恒定值作为参数向所述抽象类的构造函数),但在其他情况下,它可以“添加”参数,它要求,或有混合物。

+0

嗯,很好的例子。 – 2010-11-07 08:44:02

+0

@JonSkeet对不起2010年的帖子,但OP在其基础构造函数中没有参数,值得一提的是,如果基类中唯一的ctor是默认类,那么在派生类中调用':base()'是多余的(因为无论如何它都会被调用)。我担心“隐藏”ctor参数的需要,比如说基类需要一个'IMagicWand',派生类无法知道这个需求,直到编译器抱怨为止 - *这是我的问题抽象类中受保护的构造函数......还是我过度思考这个问题? – 2013-04-13 17:25:59

5

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

抽象类被初始化并且像任何其他类一样工作。 abstract关键字只执行以下操作:

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

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

如果您没有抽象方法,属性或事件,通过构造一个类的构造函数protected(就像你做的那样)可以得到完全相同的结果。这也阻止了类被直接实例化。与抽象类相比,行为不会发生变化。

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

+0

我特别谈到'abstract'类。 – 2010-11-07 08:29:09

0

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

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

例子:

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