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

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

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

Кроме того, это используется в singleton-классе, но за исключением которого, там какое-либо другое использование?

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

62
задан Maksym Labutin 15 January 2019 в 11:06
поделиться

8 ответов

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

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

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

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

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

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

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

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

34
ответ дан 24 November 2019 в 16:44
поделиться

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

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

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

public class Foo
{

  private Foo (){}

  private Foo FooInstance {get;set;}

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

    return FooInstance;
  }

}

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

2
ответ дан 24 November 2019 в 16:44
поделиться

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

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

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

2
ответ дан 24 November 2019 в 16:44
поделиться

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

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

0
ответ дан 24 November 2019 в 16:44
поделиться

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

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

0
ответ дан 24 November 2019 в 16:44
поделиться

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

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

15
ответ дан 24 November 2019 в 16:44
поделиться

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

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

1
ответ дан 24 November 2019 в 16:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: