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

можем ли мы унаследовать класс singleton?

6 ответов


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


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

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

применение

используйте шаблон 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> {


}

конечно. Почему бы и нет? Наследующий класс будет специализацией базового Одноэлементного класса.

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


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