Некоторые вопросы об абстрактном классе с частными, открытыми и защищенными конструкторами

Мой первый вопрос: в чем разница между защищенным и публичным конструктором в абстрактном классе?

Мои второстепенные вопросы: имеет ли смысл, если абстрактный класс имеет частный конструктор?

Спасибо заранее!

5 ответов

Один возможный проект, который использовал бы частный конструктор в абстрактном классе:

public abstract class BaseClass
{
 private BaseClass(Object param)
 {
 //Do something with parameters
 }
 //Provide various methods that descendant classes will know how to perform
 public static BaseClass FromObject(Object value)
 {
 //Based on object, choose which type of derived class to construct...
 }
 private class HiddenDerivedA : BaseClass
 {
 public HiddenDerivedA(Object value)
 : base(value)
 {
 }
 }
 private class HiddenDerivedB : BaseClass
 {
 public HiddenDerivedB(Object value)
 : base(value)
 {
 }
 }
}

Этот шаблон полезен, если производные реализации тесно связаны с логикой выбора, используемой для их построения, и вы хотите обеспечить высокую степень изоляции от остальной части вашего кода. Это освобождает вас от ответственности за поддержку других наследников, кроме тех, которые вы явно намереваетесь, и позволяет вам подвергать все частные состояния из базового класса вашим производным классам.


Вопрос №1: Не много. Вы все равно не можете вызвать конструктор абстрактного класса (создать экземпляр). Вы можете вызывать только один из подкласса, что означает, что вы определенно имеете доступ к защищенным членам, а также к публичным членам в этот момент.

Вопрос № 2: Нет, мало смысла. Частный конструктор абстрактного класса может быть вызван только "цепочкой конструкторов" из не-частного конструктора в том же классе.


  • Очень мало. Открытый конструктор может использоваться только как защищенный.

  • Да, он может быть вызван ( "боком" ) с ключевым словом this от других (защищенных/общедоступных) конструкторов.


Чтобы прояснить мои первые вопросы, я снова отвечу (без комментариев). Итак, я знаю, что невозможно сразу создать абстрактный класс. Только если класс происходит из класса abstarct, он может быть инстансирован. Я знаю, что класс может иметь конструктор, такой как закрытый, общедоступный, внутренний и также защищенный. Я знаю, что защищено.

Но какая разница между публичным защищенным конструктором в абстрактном классе. Я не вижу разницы между двумя.


Для меня, похоже, не так много, следующие выходы кода

Foo Bar

public abstract class Foo
{
 protected Foo() {
 Console.WriteLine ("Foo");
 }
}
public class Bar : Foo
{
 public Bar() {
 Console.WriteLine ("Bar");
 }
}
void Main()
{
 new Bar();
}

Конструктор-абстрактор не может быть переопределен, если он защищен. Не уверен. Если я ответил на ваш вопрос: -)

licensed under cc by-sa 3.0 with attribution.