抽象类构造函数和普通类构造函数之间的区别?

时间:2015-08-03 10:03:16

标签: c# .net oop

    abstract class Animal
    {
        public string DefaultMessage { get; set; }

        public Animal()
        {
            Console.WriteLine("Animal Cstor 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 cstror called");
        }
        public override void Speak()
        {
            Console.WriteLine("Custom Speak");//append new behavior
            base.Speak();//Re-use base behavior too
        }
    }

或者

class Animal
    {
        public string DefaultMessage { get; set; }

        public Animal()
        {
            Console.WriteLine("Animal Cstor 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 cstror called");
        }
        public override void Speak()
        {
            Console.WriteLine("Custom Speak");//append new behavior
            base.Speak();//Re-use base behavior too
        }
    }
  1. 抽象类构造函数和普通类构造函数之间的区别是什么?

2 个答案:

答案 0 :(得分:1)

没有区别而不是抽象类构造函数不能公开调用,否则它会破坏抽象类的目的(即它们必须被继承并且不能直接实例化,因此抽象类的公共构造函数可以是派生类构造函数调用!)。

答案 1 :(得分:1)

虽然您无法实例化抽象类,但它可能具有从派生类调用的构造函数。因此,抽象的应该永远不公开但受到保护。因此,与API观点的唯一区别在于,第一个不能直接从任意类调用,而普通的构造函数可以从任何地方进行调用(当然,取决于访问修饰符)。

更确切地说:Animal - 类应该永远不应该是抽象的。这意味着现有的动物无法进一步归类为猫,狗或其他动物,只有动物。