Закрытый конструктор и конструктор открытых параметров - PullRequest
8 голосов
/ 14 апреля 2010

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

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

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

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

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

Мне нужно подробное объяснение, пожалуйста.

Ответы [ 5 ]

5 голосов
/ 14 апреля 2010

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

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

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

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

4 голосов
/ 14 апреля 2010

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

Пример:

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);
}

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

2 голосов
/ 14 апреля 2010

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

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

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

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

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

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

0 голосов
/ 14 апреля 2010

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

Для получения более подробной информации обратитесь к этому: http://msdn.microsoft.com/en-us/library/kcfb85a6(VS.80).aspx

0 голосов
/ 14 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...