5

我正在为应用程序创建记录器。我正在使用第三方记录器库。其中记录器被实现为单例。

我扩展了该记录器类,因为我想添加更多静态函数。在这些静态函数中,我在内部使用 Logger(我继承的)的实例(单个)。

我既没有创建 MyLogger 的实例,也没有重新实现超类的 getInstance() 方法。但是我仍然收到警告,例如无法创建 MyLogger 的析构函数,因为父类(Loggger)析构函数不可访问。

我想知道,我做错了什么?继承单例是错误的还是应该避免?

4

4 回答 4

4

撇开单例模式的优点不谈(有一个学派将其描述为反模式),不必为了简单地添加静态功能而对其进行子类化。以下是我希望对单例进行子类化的特定于语言的方法:

  • 使用包含在 C++ 命名空间中的独立函数
  • 在 C# 中使用扩展类
  • 在 Java 中使用辅助类
  • 在 Objective-C 中使用类别
于 2012-03-26T17:33:20.207 回答
1

我会使用非单例并在需要时将调用委托给单例。每当您有机会摆脱单身人士时,就去争取。

于 2012-03-26T17:29:36.593 回答
1

我同意 Garret Hall 的观点,如果可能的话,你应该避免使用 Singleton。也就是说,我不认为这是错误的原因之一。实现 Singleton 的人允许您扩展它。如果 api 开发人员不希望扩展单例类 Logger,他们会将构造函数设为私有,例如在 C++ 中,或者任何适合您使用的语言的方法。

于 2012-03-26T17:32:08.197 回答
0

我认为在类上编写包装器不是正确的解决方案,因为您需要为单例所需的每个方法编写包装器。你最终会编写几十个函数。

此外,您还限制自己使用单例中可用的所有功能。

不是一个好主意!!!

于 2012-03-28T06:29:50.203 回答