代码之家  ›  专栏  ›  技术社区  ›  Zain Shaikh

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

  •  10
  • Zain Shaikh  · 技术社区  · 15 年前

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

    以下是我的班级结构。

    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 回复  |  直到 15 年前
        1
  •  13
  •   Jon Skeet    15 年前

    是的,完全没问题。仅仅因为构造函数只能由派生类调用并不意味着它就没有用处。例如,您可能有一个抽象类,它表示某种命名实体—将名称作为构造函数参数是有意义的。

    可能值得保护构造函数,使之更明显,您不能从其他地方直接调用它。

    注意在抽象类中有一个构造函数(或多个构造函数) 强制派生类具有相同的构造函数签名。例如:

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

        2
  •  5
  •   Pieter van Ginkel    15 年前

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

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

    • 它允许在类中包含抽象方法、属性和事件。

    例如,如果没有抽象方法、属性或事件,则可以通过使类的构造函数 protected

    然后,主要的区别就变成了将方法、属性和事件声明为抽象的能力,只有当类被标记时才可以这样做 摘要 .

        4
  •  0
  •   Chef_Code    9 年前

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

    通过将构造函数的可访问性从public更改为 受保护的

    例子:

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