Можем ли мы наследовать синглтон-класс? - PullRequest
11 голосов
/ 25 августа 2010

Можем ли мы наследовать синглтон-класс?

Ответы [ 6 ]

19 голосов
/ 25 августа 2010

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

2 голосов
/ 03 апреля 2017

Вот возможный способ обработки производного Singleton:

public abstract class Singleton<T> where T : Singleton<T>, new() {

    private static readonly T s_instance = new T();

    protected Singleton() {
        if (s_instance != null) {
            string s = string.Format(
                "An instance of {0} already exists at {0}.instance. " +
                "That's what \"Singleton\" means. You can't create another.",
                typeof(T));
            throw new System.Exception(s);
        }
    }

    public static T instance { get { return s_instance; } }
}

public class MyClass : Singleton<MyClass> {


}
2 голосов
/ 16 августа 2013

Да, вы можете.Держите конструктор базового класса защищенным (а не частным).

Тогда производный класс может быть создан, но базовый класс не может быть (даже внутри определения функции производного класса).Я пробовал это, и это хорошо работает.

2 голосов
/ 13 апреля 2011

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

Возможность доступа к объекту производного класса через статическийМетод (или свойство) базового класса является одним из ключевых понятий шаблона Singleton.Цитировать Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения (Гамма и др.):

Применимость

Использовать шаблон Singleton, когда

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

(выделено мной)

0 голосов
/ 25 августа 2010

Только сам класс синглтона может создать экземпляр ... так что я полагаю, что ответ - нет. Я думаю, что вы можете сделать это, но тогда это уже не будет синглтон: D

0 голосов
/ 25 августа 2010

Конечно.Почему бы и нет?Класс наследования будет специализацией базового класса Singleton.

Экземпляры каждого из этих классов (базовый и специализированный) будут полностью разделены.Другими словами, их члены Instance будут указывать на отдельные объекты.

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