在抽象类中使用构造函数是否合适?
创建抽象类的构造函数是一种很好的编程习惯吗?由于无法初始化抽象类,因此初始化了它们的子类。
以下是我的班级结构。
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()
{
}
}
答案 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#。
答案 3 :(得分:0)
抽象类型的构造函数只能由派生类型调用。因为公共构造函数创建类型的实例,并且您无法创建抽象类型的实例,所以具有公共构造函数的抽象类型设计不正确。 CA1012: Abstract types should not have constructors
通过将构造函数的可访问性从公共更改为受保护来修复违规。
示例:
namespace Sample
{
public abstract class Book
{
protected Book()
{
}
}
}