Делаем ли мы объект класса с частным строителем? - PullRequest
2 голосов
/ 18 января 2012

Кто-то спросил меня, можем ли мы сделать объект класса с закрытым конструктором

для E.g

    Class Parent
    {
        Private Parent()
        {
        }
    }

Поскольку я создал закрытый конструктор для класса Parent.so, очевидно, что мы не можем создать объект из родительского класса. Но есть ли способ сделать объект родительского класса без изменения закрытого конструктора в открытый?

Заранее спасибо

Ответы [ 5 ]

3 голосов
/ 18 января 2012

Вы не можете создать экземпляр Parent вне этого класса, но:

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

    public class Parent
    {
        private Parent {}
    
        public static Parent CreateParent()
        {
            return new Parent();
        }
    }
    

Иногда такой подход может оказаться полезным, если вы хотите применить проверку аргументов (и т. Д.) до создания экземпляратипа, и поэтому вы хотите заставить все через именованные фабричные методы.Это также может облегчить чтение кода, особенно если вы хотите иметь разные способы создания экземпляра из одного и того же числа значений.TimeSpan.FromSeconds, TimeSpan.FromMinutes и т. Д. Являются хорошими примерами этого.

1 голос
/ 18 января 2012

Вы можете использовать Reflection, но это можно считать мошенничеством, чтобы обойти оригинальный дизайн.

Если вы являетесь владельцем класса, вы должны использовать Factory, включив статический метод в класс Parent, который возвращает экземпляр вашего объекта.

1 голос
/ 18 января 2012

Да, вы можете получить доступ к приватному конструктору в классе Parent. Поэтому это разрешено:

class Parent
{
    private Parent()
    {
    }

    public static Parent Create()
    {
        return new Parent();
    }
}
0 голосов
/ 18 января 2012

Вы можете написать открытый статический метод в этом классе, который создает объект этого класса и возвращает его. Вот как шаблон Singleton Pattern обычно применяется на некоторых языках.

0 голосов
/ 18 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...