21

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

4

2 回答 2

25

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

   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
        }
    }

虽然我们不能直接构造Animalwith new,但构造函数会在构造 a 时被隐式调用Dog

输出:
Animal 构造函数称为
Dog 构造函数称为
Custom Speak
Default Speak

于 2013-11-13T03:37:59.970 回答
7

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

当您需要针对某些特定情况采用不同的策略时,您通常需要抽象类,因此能够在抽象类中完成其他所有事情是有意义的。制作构造函数是一个好习惯protected

于 2013-11-13T03:24:11.870 回答