Является ли расширение одноэлементного класса неправильным?

Я создаю регистратор для приложения. Я использую стороннюю библиотеку регистратора. В котором логгер реализован как синглтон.

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

Я не создавал экземпляр MyLogger и не повторно реализовывал метод getInstance() суперкласса. Но я все еще получаю предупреждения, например, деструктор MyLogger не может быть создан, поскольку деструктор родительского класса (Loggger) недоступен.

Я хочу знать, я делаю что-то не так? Наследование синглтона неправильно или его следует избегать ??


person Anwar Shaikh    schedule 26.03.2012    source источник


Ответы (4)


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

  • Используйте автономную функцию, заключенную в пространство имен C++.
  • Используйте класс расширения в C#
  • Используйте вспомогательный класс в Java
  • Используйте категорию в Objective-C
person Sergey Kalinichenko    schedule 26.03.2012
comment
Я использую язык С++. Я думаю о создании класса-оболочки только статических методов, которые не будут наследоваться от класса singleton Logger. Как это?? И не могли бы вы рассказать о методе, который вы описали выше для С++. Спасибо.. - person Anwar Shaikh; 26.03.2012
comment
@AnwarShaikh Это тоже работает - это то, что я бы сделал на Java, потому что там недоступны автономные функции. Я бы пошел по этому пути и в C++, но только если бы мне нужно было поделиться состоянием или другими деталями реализации между функциями, которые я добавляю. - person Sergey Kalinichenko; 26.03.2012
comment
Спасибо!! Я попробую написать обертку поверх него. - person Anwar Shaikh; 26.03.2012

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

person Garrett Hall    schedule 26.03.2012
comment
Да, конечно, синглтонов нужно избегать, но оказывается, что это хорошо, когда используется для чего-то вроде Logger. что, если мне нужны некоторые дополнительные методы наряду с теми, которые находятся в синглтоне, я должен наследовать его или написать оболочку (класса только со статическими методами) над синглтоном, который внутренне использует синглтон. - person Anwar Shaikh; 26.03.2012
comment
Перейти на обертку. Вот что я имел в виду под «вызовами делегатов». - person Garrett Hall; 26.03.2012

Я согласен с Гарретом Холлом, вам следует избегать Синглтона, если это возможно. Тем не менее, я не считаю это неправильным по одной причине. Человек, который реализовал Singleton, позволил вам расширить его. Если бы разработчик API не хотел, чтобы одноэлементный класс Logger был расширен, он сделал бы конструктор закрытым, например, в C++ или в любом другом методе, подходящем для используемого вами языка.

person nathan    schedule 26.03.2012

Я думаю, что писать обертку над классом - не правильное решение, потому что вам нужно написать обертку для каждого метода, который вам нужен из синглтона. И в итоге вы пишете десятки функций.

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

НЕ ХОРОШАЯ ИДЕЯ!!!

person Coder223    schedule 28.03.2012