2012-03-26 3 views
5

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

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

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

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

ответ

4

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

  • Используйте свободно стоящую функцию заключена в C++ имен
  • Используйте класс расширения в C#
  • Используй вспомогательный класс в Java
  • Используйте категорию в Objective-C
+0

Я использую язык C++. Я думаю о создании класса-оболочки только статических методов, которые не будут наследоваться от одиночного класса Logger. Как оно?? И, пожалуйста, подробно остановитесь на методе, описанном выше для C++. Спасибо .. – EngineeredBrain

+0

@AnwarShaikh Это тоже работает - это то, что я буду делать на Java, потому что свободные функции там недоступны.Я бы тоже поехал по этому маршруту на C++, но только если мне нужно было предоставить информацию о состоянии или других деталях реализации среди функций, которые я добавляю. – dasblinkenlight

+0

Спасибо! Я попробую написать обертку поверх нее. – EngineeredBrain

0

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

+0

Да, конечно, нужно избегать одиночных игр, но это хорошо, когда используется для чего-то вроде Logger. Что делать, если мне нужны дополнительные методы вместе с теми, которые находятся в singleton, следует ли мне наследовать его или писать оболочку (класса только с статическими методами) поверх singleton, которая внутренне использует singleton. – EngineeredBrain

+0

Пойдите для обертки. Это то, что я имел в виду под «делегатскими вызовами». –

0

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

0

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

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

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

Смежные вопросы