Частный конструктор и общедоступный конструктор параметра

Я слышал, что частный конструктор предотвращает создание объекта от внешнего мира.

Когда у меня есть код

public class Product
{
   public string Name { get;set;}
   public double Price {get;set;}
   Product()
   {
   }

   public Product(string _name,double _price)
   {
   }
}

Здесь я все еще могу объявить общедоступного конструктора (параметр), разве он не испортит цель частного конструктора? Когда нам нужен и частный и общедоступный конструктор (параметр) в коде?

Мне нужно подробное объяснение.

8
задан S.L. Barth - Reinstate Monica 7 November 2016 в 15:07
поделиться

5 ответов

Причина, по которой вы используете описанный вами паттерн, - это когда вы хотите контролировать как инстанцируется объект.

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

Если бы вы хотели полностью предотвратить создание объекта, вам пришлось бы сделать все конструкторы приватными (или защищенными). Это заставит объект быть созданным внутри самого себя (или наследуемого класса).

Кроме того, как отметил Матти в комментарии ниже, когда вы определяете конструктор с параметрами, вам не нужно указывать приватный конструктор по умолчанию. В этот момент он подразумевается.

5
ответ дан 5 December 2019 в 15:21
поделиться

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

Пример:

public class Test
{
    private Test(int? a,string b) { }
    public Test(int a) : this(a, null) { }
    public Test(string b) : this(null, b) { }
}

Здесь есть два общедоступных конструктора, один из которых принимает строку, а другой - int, и они оба связаны с общим частным конструктором, который принимает оба аргумента.

Кроме того, конечно, вы можете создавать новые объекты из одного и того же класса, используя частный конструктор, например, вы можете захотеть, чтобы специализированные конструкторы были доступны только через статические фабричные методы:

public static Test Create()
{
    int? a = ReadConfigurationForA();
    string b = ReadConfigurationForB();
    return new Test(a, b);
}

Здесь может быть не самая лучшая идея предоставьте частный конструктор внешнему миру, но вместо этого добавьте статический фабричный метод, который выбирает правильные аргументы для передачи конструктору.

4
ответ дан 5 December 2019 в 15:21
поделиться

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

Для получения дополнительных сведений см. Это: http://msdn.microsoft.com/en-us/library/kcfb85a6 (VS.80) .aspx

0
ответ дан 5 December 2019 в 15:21
поделиться

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

С частным конструктором вы можете сделать что-то вроде:

public static GetInstance ()
{
   return new YourObject();
}

, но ничто другое, кроме объекта, не может вызывать конструктор без параметров.

Обычно используется для создания одноэлементного шаблона:

http://www.dofactory.com/Patterns/PatternSingleton.aspx

2
ответ дан 5 December 2019 в 15:21
поделиться

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

0
ответ дан 5 December 2019 в 15:21
поделиться
Другие вопросы по тегам:

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