Как уже говорили другие, абстрактные классы обычно имеют конструкторы (либо явно, либо класс по умолчанию, созданный компилятором), и любой конструктор производного класса должен будет проходить через конструктор абстрактного класса обычным способом.Это важный бит ... предположим, у вас есть абстрактный класс, в котором хранится имя, связанное с экземпляром, - потому что вы всегда хотите имя и не хотите записывать свойство Name
в каждомконкретный производный класс.Вы можете предоставить конструктор, который берет это имя и присваивает его полю ... и тогда каждому конструктору подкласса придется пройти через этот конструктор, чтобы вы все еще знали, что у вас всегда будет имя.Если вы хотите узнать больше о цепочке конструктора, прочитайте мою статью о ней .
Вот пример этого:
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 не может быть частных абстрактных методов, но они могут иметь частные конструкторы.Действительно, иногда бывает полезно иметь только частных конструкторов в абстрактном классе, потому что это означает, что класс может быть получен только из в тексте программы того же класса .Это позволяет вам создавать псевдо-перечисления:
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;
}
}
}
В этом отношении абстрактный закрытый метод / свойство может иметь смысл - к нему может обращаться базовый класс, но он предоставляетсяпроизводные классы в тексте программы того же класса.Однако это запрещено спецификацией.Обычно protected
абстрактные члены решают ту же проблему, но не всегда.