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

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

10 голосов | спросил Ram 25 PM00000020000005731 2010, 14:08:57

6 ответов


0

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

ответил Andrey 25 PM00000020000004931 2010, 14:12:49
0

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

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

  

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

     

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

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

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

ответил Oswald 13 PMpWed, 13 Apr 2011 17:59:04 +040059Wednesday 2011, 17:59:04
0

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

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

ответил Atul 16 PM000000120000003731 2013, 12:09:37
0

Вот возможный способ обработки производного 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> {


}
ответил Kaleb Grace 3 AMpMon, 03 Apr 2017 06:47:42 +030047Monday 2017, 06:47:42
0

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

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

ответил Emmanuel 25 PM00000020000000931 2010, 14:13:09
0

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

ответил Jonathan 25 PM00000020000001831 2010, 14:13:18

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132