关于c#:为什么抽象类有构造函数?

Why can an abstract class have constructor?

本问题已经有最佳答案,请猛点这里访问。

抽象类为什么有构造函数?有什么意义?很明显,我们不能创建抽象类的实例。


一个重要原因是,在派生构造函数执行之前存在对基构造函数的隐式调用。记住,与接口不同,抽象类确实包含实现。该实现可能需要字段初始化或其他实例成员。请注意以下示例和输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
   abstract class Animal
   {
       public string DefaultMessage { get; set; }

       public Animal()
       {
           Console.WriteLine("Animal constructor called");
           DefaultMessage ="Default Speak";
       }
       public virtual void Speak()
       {
           Console.WriteLine(DefaultMessage);
       }
   }

    class Dog : Animal
    {
        public Dog(): base()//base() redundant.  There's an implicit call to base here.
        {
            Console.WriteLine("Dog constructor called");
        }
        public override void Speak()
        {
            Console.WriteLine("Custom Speak");//append new behavior
            base.Speak();//Re-use base behavior too
        }
    }

虽然我们不能用new直接构造Animal,但是当我们构造Dog时,隐式调用了构造函数。

产量:
调用了动物构造函数
调用了dog构造函数
自定义语音
默认发言


您仍然可以初始化任何变量、依赖项,并且可以设置继承类的构造函数的签名。

当您需要对某些特定的情况使用不同的策略时,通常需要抽象类,因此能够在抽象类中执行其他所有操作是有意义的。而构造方法protected是一个很好的实践。