【问题标题】:abstract an Interface `ISingleton` to be base class将接口“ISingleton”抽象为基类
【发布时间】:2010-12-01 00:48:13
【问题描述】:

我有 3 个接口类 IVideo , IAudio , IGPIO 和其他三个将实现这些接口的类:Video_impl , Audio_impl , GPIO_impl

到目前为止一切都很简单。

但是,我希望所有这些对象都是singleton。以下是问题:

抽象一个接口 ISingleton 是个好主意,以便 Video_impl , Audio_impl , GPIO_impl (或 IVideo , IAudio , IGPIO ?)可以继承它?

我正在考虑以下列方式实现它。推荐吗?我认为必须有更好的方法。

//Isingleton.hpp
template <class T>
class ISingleton
{
public:
virtual T *getInstance() = 0;

};

class IGPIO
{
public:
virtual int SelectAudioInput() = 0;
};

class GPIO_impl : public IGPIO, public ISingleton<IGPIO>
{
public:
    IGPIO *getInstance();
    int SelectAudioInput() ;
private:
    IGPIO *instance;
};

【问题讨论】:

  • 看起来更像 C++ 而不是 C# ...
  • 谢谢,Stefan。它是 C++。

标签: c++ design-patterns singleton multiple-inheritance


【解决方案1】:

我建议阅读 Alexandrescu 的“现代 C++ 设计”。在其中,他设计了一个成熟的单例模板,并思考了很多问题,比如什么时候销毁,销毁后是否应该复活,因为在销毁其他单例时需要它,以及所有的好东西。

【讨论】:

  • 确实寿命问题很棘手,不容小觑,我喜欢凤凰政策:)
【解决方案2】:

我没有看到这里的好处。您仍然必须在派生类中实现 getInstance() 方法。所以你已经引入了模板和多重继承,但并没有真正获得任何东西。我能看到的唯一小收获是您让所有单身人士共享一个通用方法,但这是一种常见的模式,我认为这不是真正的收获。

【讨论】:

    【解决方案3】:

    您的单身人士将无法正常工作。您不能使用虚方法返回实例,因为它只能用实例调用。你至少需要一个静态方法,或者一个实现单例的中间对象。

    如果你打算像这样概括它,你应该阅读 C++ 中单例的实现。然而,我对所有库代码的建议是首先创建您需要的干净简单的实现。在单例情况下,这将简单地将其实现为没有继承的静态方法。然后并且只有当你多次实现它并完全理解抽象实现的所有动机和细节时,你才应该为它创建一个库。过早创建库是导致错误和无法维护代码的最大原因之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-22
      • 2011-05-22
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      • 2017-02-19
      • 2013-03-12
      • 2011-07-14
      相关资源
      最近更新 更多