Подтвердить что ты не робот

Зачем нужен частный конструктор?

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

Какая польза от частного конструктора?

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

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

4b9b3361

Ответ 1

Factory

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

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

Псевдозапечатанные с вложенными детьми

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

Например, вы можете использовать это для создания абстрактного класса, который вы можете наследовать, но никто другой (конструктор 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) { }
}

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

Хорошо, если ваша единственная цель состоит в том, что вы не хотите, чтобы он был создан, то сделать его статическим достаточно.

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

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

Ответ 5

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

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

Например, экземпляр singleton:

public class Foo
{

  private Foo (){}

  private Foo FooInstance {get;set;}

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

    return FooInstance;
  }

}

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

Ответ 6

Цель создания частного конструктора в классе

  • Чтобы ограничить наследуемый класс.

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

  • Чтобы достичь шаблона проектирования singleton.

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

Ответ 7

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

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

Ответ 8

Если класс ONLY имеет частные конструкторы, он не может быть создан извне.

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

Ответ 9

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

Примером этого является класс Graphics с методами From *.

Ответ 10

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