在 C# 中我们不能创建抽象类或接口(interface)的对象,这意味着抽象类没有任何构造函数,对吗? 或者如果它有那么它的目的是什么?
最佳答案
正如其他人所说,抽象类通常具有构造函数(显式构造函数或由编译器创建的默认构造函数)- 任何派生类构造函数都必须以正常方式链接抽象类的构造函数。这是重要的一点……假设您有一个抽象类,它存储与实例关联的名称 - 因为您总是想要一个名称,而您不想编写 Name
每个具体派生类中的属性。您可能会提供一个构造函数,它采用该名称并将其分配给一个字段...然后每个子类构造函数都必须通过该构造函数,这样您仍然知道您总是有一个名字.如果您想了解有关构造函数链接的更多信息,请阅读 my article on it .
举个例子:
public abstract class DemoBase
{
private readonly string name;
public string Name { get { return name; } }
protected DemoBase(string name)
{
this.name = name;
}
// Abstract members here, probably
}
public class FixedNameDemo : DemoBase
{
public FixedNameDemo()
: base ("Always the same name")
{
}
// Other stuff here
}
public class VariableNameDemo : DemoBase
{
public VariableNameDemo(string name)
: base(name)
{
}
// Other stuff here
}
为了进一步回答您对 BoltClock 的回答的评论,asbtract 类不能有私有(private)抽象方法,但它们可以有私有(private)构造函数。事实上,在抽象类中仅私有(private)构造函数有时很有用,因为这意味着该类只能从同一类的程序文本中派生。这允许您创建伪枚举:
public abstract class ArithmeticOperator
{
public static readonly ArithmeticOperator Plus = new PlusOperator();
public static readonly ArithmeticOperator Minus = new MinusOperator();
public abstract int Apply(int x, int y);
private ArithmeticOperator() {}
private class PlusOperator : ArithmeticOperator
{
public override int Apply(int x, int y)
{
return x + y;
}
}
private class MinusOperator : ArithmeticOperator
{
public override int Apply(int x, int y)
{
return x - y;
}
}
}
在这方面,抽象私有(private)方法/属性可能有意义 - 它可以由基类访问,但由同一类的程序文本中的派生类提供。但是,规范禁止这样做。通常,protected
抽象成员可以解决同样的问题 - 但并非总是如此。
关于c# - C#中的抽象类构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3930271/