Ответ 1
Например, если у вас есть класс, который должен быть создан только с помощью методов factory. Или если у вас есть перегрузки конструктора, а некоторые из них должны использоваться только другими конструкторами. Вероятно, и другие причины =)
Для чего нужен частный конструктор в С#? Я получил это как вопрос для теста С#.
Например, если у вас есть класс, который должен быть создан только с помощью методов factory. Или если у вас есть перегрузки конструктора, а некоторые из них должны использоваться только другими конструкторами. Вероятно, и другие причины =)
Если вы знаете какой-то шаблон дизайна, это очевидно: класс может создать новый экземпляр сам по себе и не позволить другим делать это. Пример в Java (я не знаю, С# достаточно, извините) с singleton-классом:
class Meh
{
private Meh() { }
private static Meh theMeh = new Meh();
public static Meh getInstance() { return theMeh; }
}
Всякий раз, когда вы хотите предотвратить непосредственное создание экземпляра класса извне, вы будете использовать конструктор private
. Например, перед С# 2.0, в котором были введены классы static
, вы использовали конструктор private
для выполнения примерно одного и того же:
sealed class StaticClass {
private StaticClass() {
}
public static void DoSomething() {
}
}
Если вы хотите запретить пользователям вашего класса напрямую создавать экземпляр класса. Некоторые распространенные случаи:
Я могу вспомнить несколько применений для него:
Например, когда вы предоставляете методы factory для управления конкретизацией...
public class Test(){
private Test(){
}
void DoSomething(){
// instance method
}
public static Test CreateCoolTest(){
return new Test();
}
}
Частные конструкторы используются для предотвращения создания экземпляров класса, когда нет полей или методов экземпляра, таких как класс Math, или когда вызывается метод для получения экземпляра класса. Если все методы в классе статичны, подумайте о том, чтобы сделать весь класс статическим. Дополнительные сведения см. В разделе Статические классы и члены статического класса.
class NLog
{
// Private Constructor:
private NLog() { }
public static double e = System.Math.E; //2.71828...
}
Ниже приведен пример класса с использованием частного конструктора.
public class Counter
{
private Counter() { }
public static int currentCount;
public static int IncrementCount()
{
return ++currentCount;
}
}
class TestCounter
{
static void Main()
{
// If you uncomment the following statement, it will generate
// an error because the constructor is inaccessible:
// Counter aCounter = new Counter(); // Error
Counter.currentCount = 100;
Counter.IncrementCount();
System.Console.WriteLine("New count: {0}", Counter.currentCount);
}
}
Пока эта ссылка связана с java, я думаю, это поможет вам понять причину, по которой идея почти такая же.
Частные конструкторы запрещают явным образом создавать экземпляр класса вызывающими. Существуют некоторые распространенные случаи, когда частный конструктор может быть полезен:
- классы, содержащие только статические методы утилиты
- классы, содержащие только константы
- безопасные перечисления типов
- одиночек
Вы можете использовать его с наследованием в случае, когда аргументы конструктора для базового класса относятся к типам конструкторов дочерних классов, но вам по-прежнему нужны функциональные возможности базового класса в дочернем классе, например. защищенные методы.
В общем, хотя этого следует избегать, когда это возможно, поскольку это плохая форма наследования, которую нужно использовать.
Я опаздываю на игру, но, прочитав все остальные ответы, я не вижу упоминания об этом использовании:
Я использую частные конструкторы в сценариях, где у меня несколько (общедоступных) конструкторов, и все они имеют общий код. С цепью конструктора код становится действительно опрятным и сухим.
Помните, что частные переменные readonly могут быть установлены только в конструкторах, поэтому я не могу использовать обычный метод.
Пример:
public class MyClass
{
private readonly int _a;
private readonly int _b;
private readonly string _x;
public MyClass(int a, int b, string x)
: this(x)
{
_a = a;
_b = b;
}
public MyClass()
: this("(not set)")
{
// Nothing set here...
}
private MyClass(string x)
{
_x = x;
}
}
В основном вы используете частные конструкторы, когда следуете шаблону проектирования singleton. В этом случае у вас есть статический метод, определенный внутри класса, который внутренне вызывает частный конструктор.
Итак, чтобы создать экземпляр класса в первый раз, пользователь вызывает имя_файла .static_method_name. В этом методе, поскольку объект класса еще не существует, статический метод внутренне вызывает частный конструктор и возвращает экземпляр класса.
Если экземпляр класса уже существует, то статический метод просто возвращает экземпляр вызывающему методу.
И, конечно, вы можете использовать частный конструктор для предотвращения подкласса.