2010-04-06 4 views
47

Если класс имеет частный конструктор, то он не может быть создан. Итак, если я не хочу, чтобы мой класс был создан и все еще использовал его, я могу сделать его статическим.Зачем нам нужен частный конструктор?

Что такое частный конструктор?

Также он используется в одном классе, но кроме этого, есть ли другое использование?

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

ответ

47

завод

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

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

Псевдо-Sealed с вложенными Детьми

Любых вложенных классов, наследуемыми от внешнего класса может получить доступ к закрытому конструктору.

Например, вы можете использовать это, чтобы создать абстрактный класс, который вы может наследовать, но ни один другой (internal конструктор не будет работать здесь, чтобы ограничить наследование одной сборки, но private конструктор силы все реализации быть вложенными классами.)

public abstract class BaseClass 
{ 
    private BaseClass() { } 

    public class SubClass1 : BaseClass 
    { 
     public SubClass1() : base() { } 
    } 

    public class SubClass2 : BaseClass 
    { 
     public SubClass2() : base() { } 
    } 
} 

Base Конструктор

Они также могут быть использованы для создания «базовых» конструкторы, которые вызываются из разных, больше ACCE ssible конструкторы.

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) { } 
} 
+0

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

+0

Adam-thank u так много, это имеет смысл сейчас !!!! –

+0

Первый пример - пример SingletonFactory? –

14

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

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

+0

Просто для полноты картины: Можно пометить класс статический, который обеспечивает только статический члены допускаются и что класс не может быть создан. – flq

+0

Stefan - спасибо за ответ, это помогло !!! –

2

Ну, если ваша единственная цель состоит в том, что вы не хотите, чтобы она была создана, то сделать ее статичной будет достаточно.

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

Исторически, помните, что создание статического класса не всегда было вокруг ... Создание частного сектора было способом сделать его не-инстантабельным (это слово?), Прежде чем статическое ключевое слово можно применить к классу ...

0

Если класс ТОЛЬКО имеет частные конструкторы, он не может быть создан извне.

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

1

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

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

Например одноэлементно экземпляр:

public class Foo 
{ 

    private Foo(){} 

    private Foo FooInstance {get;set;} 

    public static Foo GetFooInstance() 
    { 
    if(FooInstance == null){ 
     FooInstance = new Foo(); 
    } 

    return FooInstance; 
    } 

} 

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

0

Если вы хотите создать фабрику для класса, вы можете использовать частный конструктор и добавить к классу статические «фабричные» методы для создания класса.

Примером может служить класс Graphics с методами From *.

22

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

Чтобы ответить на вторую часть вашего вопроса о том, почему необходимы одиночки, если статические классы существуют: одиночек и статические классы не эквивалентна.

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

Важно понимать особенности языка и выбирать правильный вариант для работы - они есть по какой-то причине.

+0

Отличный ответ :-) –

+1

отличное описание дифференциация одиночныйton & статический. Спасибо !!!! –

+0

Отличное объяснение о синглтоне против статического класса! Я учусь от этого! FWIW, вы можете фактически использовать «статическую инициализацию» для инициализации нестатического одноэлементного класса. См. [Официальная документация по этому вопросу] (https://msdn.microsoft.com/en-us/library/ff650316.aspx). Это еще одна концепция, которая заставит вас запутаться в начале и узнать что-то хорошее в конце. :-) – RayLuo

1

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

Как обсуждается LBushkin's answer, хотя некоторые цели использования singleton могут быть выполнены с использованием статических классов, конкретная реализация singleton может превышать набор функций только статических классов.

1

Цель создать приватный конструктор в классе

  1. Чтобы ограничить класс наследуется.

  2. Ограничить экземпляр класса или создать несколько экземпляров/объектов.

  3. Для достижения шаблона одноэлементного дизайна.

    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 
        } 
    } 
    
0
  • Одним из вариантов использования частной конструкции, когда мы имеем только статический член.
  • Как только мы предоставим конструктор, который является либо приватным, либо общедоступным или любым, компилятор не позволит нам добавить в класс открытый конструктор без параметров.
  • Если мы хотим создать объект класса, даже если у нас есть частные конструкторы, то мы должны иметь открытый конструктор наряду с частным конструктору
Смежные вопросы