Что такое практические применения защищенного конструктора?

Мнение: SQL - это код. Относитесь к нему как к такому

То есть, так же, как ваш C #, Java или другой любимый язык объектов / процедур, разработайте стиль форматирования, который будет удобочитаемым и поддерживаемым.

Я ненавижу, когда вижу неаккуратный свободно форматированный код SQL. Если вы кричите, когда видите на странице оба стиля фигурных скобок, почему или почему вы не кричите, когда видите свободно отформатированный SQL или SQL, который затемняет или запутывает условие JOIN?

77
задан DavidRR 3 April 2013 в 17:28
поделиться

7 ответов

Когда класс (задуман как) абстрактный класс, защищенный конструктор совершенно прав. В этой ситуации вы не хотите, чтобы объекты создавались из класса, а использовали его только для наследования.

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

99
ответ дан 24 November 2019 в 10:56
поделиться

можно использовать заводские шаблоны

9
ответ дан 24 November 2019 в 10:56
поделиться

Защищенный конструктор означает, что только производные члены могут создавать экземпляры класса (и производные экземпляры) с использованием этого конструктора. Это звучит немного банально, но иногда полезно при реализации фабрик классов.

6
ответ дан 24 November 2019 в 10:56
поделиться

Непубличные конструкторы полезны, когда есть требования к конструкции, которые не могут быть гарантированы только конструктором. Например, если метод инициализации необходимо вызвать сразу после конструктора, или если объекту необходимо зарегистрировать себя в каком-либо объекте контейнера / менеджера, это необходимо сделать вне конструктора. Ограничивая доступ к конструктору и предоставляя только фабричный метод, вы можете гарантировать, что любой экземпляр, получаемый пользователем, будет выполнять все его гарантии. Это также обычно используется для реализации синглтона, который на самом деле является еще одной гарантией, которую дает класс (что будет только один экземпляр).

Причина, по которой конструктор должен быть защищен, а не закрытым, та же, что и для сделать любой другой метод или поле защищенным вместо закрытого: чтобы его могли унаследовать дети. Возможно, вам нужен общедоступный невиртуальный фабричный метод в базовом классе, который возвращает ссылки на экземпляры производных классов; производным классам, очевидно, нужен доступ к родительским конструкторам, но вы все равно не хотите создавать их вне своей фабрики.

9
ответ дан 24 November 2019 в 10:56
поделиться

Для фабричных методов с побочными эффектами.

class mine {

  private:
    mine () {};

  protected:
    mine(int id) : m_id(id) {};

   int m_id;
   static int m_count;

  public:
    static mine* CreateOneOfMe() {
         return mine(m_count++);
    }

    int GetId() { return m_id; }

 };

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

6
ответ дан 24 November 2019 в 10:56
поделиться

Разрешить подклассу использовать конструктор, который не должен быть доступен для создания экземпляра напрямую.

4
ответ дан 24 November 2019 в 10:56
поделиться

Вы можете использовать его для ограничения классов, которые могут его создать, например:

class Level
{
private:

 Level();
 ¨Level();

 friend class LevelManager;
};

Единственный класс, который может создать его экземпляр, - это класс LevelManager, поэтому вы всегда будете знать, что экземпляр уровня создается в LevelManager.

3
ответ дан 24 November 2019 в 10:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: