【发布时间】:2013-11-25 12:21:32
【问题描述】:
为什么抽象类有构造函数?重点是什么?很明显,我们不能创建抽象类的实例。
【问题讨论】:
标签: c# oop abstract-class
为什么抽象类有构造函数?重点是什么?很明显,我们不能创建抽象类的实例。
【问题讨论】:
标签: c# oop abstract-class
您仍然可以初始化任何变量、依赖项,并且可以设置继承类的构造函数的签名。
当您需要针对某些特定情况采用不同的策略时,您通常需要抽象类,因此能够在抽象类中完成其他所有事情是有意义的。并且将构造函数设为protected 是一个很好的做法。
【讨论】:
一个重要的原因是由于在派生构造函数执行之前对基构造函数的隐式调用。请记住,与接口不同,抽象类确实包含实现。该实现可能需要字段初始化或其他实例成员。请注意以下示例和输出:
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时隐式调用的。
输出:
调用动物构造函数
狗构造函数调用
自定义语音
默认说话
【讨论】: