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
}
}
答案 0 :(得分:1)
没有区别而不是抽象类构造函数不能公开调用,否则它会破坏抽象类的目的(即它们必须被继承并且不能直接实例化,因此抽象类的公共构造函数可以是仅派生类构造函数调用!)。
答案 1 :(得分:1)
虽然您无法实例化抽象类,但它可能具有从派生类调用的构造函数。因此,抽象的应该永远不公开但受到保护。因此,与API观点的唯一区别在于,第一个不能直接从任意类调用,而普通的构造函数可以从任何地方进行调用(当然,取决于访问修饰符)。
更确切地说:Animal
- 类应该永远不应该是抽象的。这意味着现有的动物无法进一步归类为猫,狗或其他动物,只有动物。