【问题标题】:Difference between abstract class constructor and normal class constructor?抽象类构造函数和普通类构造函数的区别?
【发布时间】:2015-10-25 09:34:49
【问题描述】:
    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. 抽象类构造函数和普通类构造函数有什么区别?

【问题讨论】:

  • 自己做作业和让别人帮你做有什么区别?你明白你在问什么吗?
  • ## CodeCaster DUDE ## 我从小就做作业,现在我站着问这个问题抽象类构造函数和普通类构造函数有什么区别?
  • 是的,我可以阅读。区别在于一个是抽象的,另一个不是。你为什么想知道?这真的是你想知道的吗?你打算如何处理这些答案?如果这归结为“解释抽象在 C# 中的含义”,那就太宽泛了。
  • @COSNFUSING_CODER 不要使用大写字母!如果您还有其他问题,您应该提出一个新问题,并且您还需要将当前问题的一些给出的答案标记为适合您的答案。
  • 请把帽子放在外面。在那个评论中你改变了你的问题,现在是“为什么我们使用抽象构造函数?”,这是一个不同的问题(之前已经回答过)。参见例如Can an abstract class have a constructor?

标签: c# .net oop


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    更准确地说:Animal-class 可能永远不应该是非抽象的。这意味着存在的动物不能进一步归类为猫、狗或其他任何东西,而只能归类为动物。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      • 2011-03-16
      相关资源
      最近更新 更多