为什么抽象类有构造函数?重点是什么?很明显,我们无法创建抽象类的实例。
答案 0 :(得分:22)
一个重要原因是由于在派生构造函数执行之前对基础构造函数进行了隐式调用。请记住,与接口不同,抽象类确实包含实现。该实现可能需要字段初始化或其他实例成员。请注意以下示例和输出:
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
}
}
虽然我们无法使用Animal
直接构造new
,但在构造Dog
时会隐式调用构造函数。
<强>输出:强>
动物构造函数叫做
狗建设者称为
自定义说话
默认发言
答案 1 :(得分:7)
您仍然可以初始化任何变量,依赖项,并且可以设置继承类的构造函数的签名。
当您需要针对某些特定情况使用不同的策略时,通常需要抽象类,因此能够在抽象类中执行其他所有操作是有意义的。制作构造函数protected
是一个很好的做法。