Является ли расширение одноэлементного класса неправильным? - PullRequest
5 голосов
/ 26 марта 2012

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 26 марта 2012

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

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

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

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

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

0 голосов
/ 26 марта 2012

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

0 голосов
/ 26 марта 2012

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

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