Зачем нам нужен частный конструктор?
Если класс имеет частный конструктор, то он не может быть создан.
Поэтому, если я не хочу, чтобы мой класс был создан и все еще использовал его, я могу сделать его статичным.
Что такое использование частного конструктора?
также он используется в одноэлементном классе, но кроме этого, есть ли другое применение?
(Примечание: причина, по которой я исключаю случай синглтона выше, заключается в том, что я не понимаю, зачем нам вообще нужен синглтон, когда есть статический класс доступный. Вы не можете ответить на это из-за моей путаницы в вопросе. )
10 ответов:
завод
частные конструкторы могут быть полезны при использовании фабричного шаблона (другими словами, статической функции, которая используется для получения экземпляра класса, а не явного экземпляра).
public class MyClass { private static Dictionary<object, MyClass> cache = new Dictionary<object, MyClass>(); private MyClass() { } public static MyClass GetInstance(object data) { MyClass output; if(!cache.TryGetValue(data, out output)) cache.Add(data, output = new MyClass()); return output; } }псевдо-запечатанный с вложенными детьми
вложенные классы, которые наследуют от внешнего класса может получить доступ к закрытому конструктору.
например, вы можете использовать это для создания абстрактного класса, который вы может наследовать, но никто другой (an
internalконструктор также будет работать здесь, чтобы ограничить наследование одной сборкой, ноprivateконструктор заставляет все реализации быть вложенными классами.)public abstract class BaseClass { private BaseClass() { } public class SubClass1 : BaseClass { public SubClass1() : base() { } } public class SubClass2 : BaseClass { public SubClass2() : base() { } } }Базовый Конструктор
они также могут быть использованы для создания "базовых" конструкторов, которые вызываются из разных, более доступных конструкторов.
public class MyClass { private MyClass(object data1, string data2) { } public MyClass(object data1) : this(data1, null) { } public MyClass(string data2) : this(null, data2) { } public MyClass() : this(null, null) { } }
Как Стефан, Адам и другие отмечали, частные конструкторы полезны в тех случаях, когда нежелательно, чтобы класс создавался кодом вне класса. Синглтоны, фабрики, статические объекты метода являются примерами того, где возможность ограничения конструктора типа полезна для применения определенного шаблона.
чтобы ответить на вторую часть вашего вопроса о том, зачем нужны синглеты, если существуют статические классы: синглтоны и статические классы не эквивалентны.
например, одноэлементный класс может реализовать интерфейс, статический класс не может. Одноэлементный объект может быть передан методам в качестве параметра - это не так просто сделать со статическими классами, не прибегая к объектам-оболочкам или отражению. Есть также случаи, когда вы можете создать иерархию наследования, в которой один (или несколько) из конечных классов являются одноэлементными - это также невозможно со статическими классами. Как другой пример, у вас может быть несколько разных синглетов, и вы можете создать экземпляр одного из них во время выполнения на основе параметров среды или конфигурации - это также невозможно со статическими классами.
важно понимать особенности языка и выбрать правильный для работы - они есть не просто так.
иногда вы не должны быть в состоянии создать экземпляр класса. Это делает это явным и обеспечивает это на уровне компилятора.
синглтоны-это только один вариант использования. Константы классов, статических классов, методов и другие типы моделей диктовать, что класс не должен быть instantiable.
Ну, если ваша единственная цель заключается в том, что вы не хотите, чтобы он был создан, то достаточно сделать его статичным.
Если, otoh, вы просто не хотите, чтобы он был создан frm вне класса (возможно, вы хотите, чтобы пользователи получали его только с помощью статической фабрики в классе) - тогда вам нужен частный ctor, чтобы позволить этим общедоступным статическим фабрикам создавать его.
исторически, помните, что создание статического класса не всегда было вокруг... Создание ctor private было способом сделать его не-инстанцируемым (это слово? ) прежде чем ключевое слово static может быть применено к классу...
цель создания частного конструктора в классе
чтобы ограничить наследование класса.
ограничить класс, являющийся экземпляром или создающий несколько экземпляров/объектов.
для достижения одноэлементный шаблон проектирования.
public class TestPrivateConstructor { private TestPrivateConstructor() { } public static int sum(int a , int b) { return a + b; } } class Program { static void Main(string[] args) { // calling the private constructor using class name directly int result = TestPrivateConstructor.sum(10, 15); // TestPrivateConstructor objClass = new TestPrivateConstructor(); // Will throw the error. We cann't create object of this class } }
вы можете использовать его, чтобы заставить синглтон экземпляр или создать завод класса.
статический метод можно вызвать приватный конструктор для создания нового экземпляра этого класса.
например одноэлементный экземпляр:
public class Foo { private Foo (){} private Foo FooInstance {get;set;} public static Foo GetFooInstance () { if(FooInstance == null){ FooInstance = new Foo(); } return FooInstance; } }Это позволяет создать только один экземпляр класса.
Что касается синглетов - синглтон-это шаблон проектирования, используемый, когда среда и требования удовлетворяют аналогичным мотивациям для использования шаблона; статические классы являются языковой функцией.
Как LBushkin это обсуждается, в то время как некоторые из целей использования синглтона могут быть достигнуты с помощью статических классов, конкретная реализация синглтона может превышать набор функций только статических классов.
- одно использование частной конструкции-это когда у нас есть только статический член.
- Как только мы предоставим конструктор, который является либо частным, либо общедоступным, либо любым, компилятор не позволит нам добавить общедоступный конструктор без параметров в класс.
- Если мы хотим создать объект класса, даже если у нас есть частные строители, то мы должны иметь открытый конструктор с конструктор
Если класс имеет только частные конструкторы,он не может быть создан извне.
вы также можете иметь частные конструкторы и публичные конструкторы с разными сигнатурами.
Если вы хотите создать фабрику для класса, вы можете использовать частный constructur и добавить некоторые статические методы "фабрики" к самому классу для создания класса.
примером для этого является графика класс, с помощью методов From*.
Comments