2009-09-24 7 views
0

J'ai 3 classes d'interface IVideo , IAudio , IGPIO et trois autres classes qui implémenteront ces interfaces: Video_impl , Audio_impl , GPIO_impl.abstract Une interface `ISingleton` pour être la classe de base

Les choses sont simples jusqu'à maintenant.

Mais alors, je veux que tous ces objets soient singleton. Voici les questions:

Est-ce une bonne idée de faire abstraction d'une interface ISingleton, de sorte que Video_impl , Audio_impl , GPIO_impl (ou IVideo , IAudio , IGPIO?) Puisse en hériter? Je pensais l'implémenter de la manière suivante. Est-ce recommandé? Je pense qu'il doit y avoir de meilleurs moyens.

//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; 
}; 
+0

Ressemble plus à C++ puis C# ... –

+0

Merci, Stefan.C'est C++. – pierrotlefou

Répondre

3

Je vous recommande de lire "Modern C++ Design" d'Alexandrescu. Dans ce document, entre autres choses, il conçoit un modèle de singleton à part entière et réfléchit à de nombreux problèmes, tels que le moment où il devrait être détruit, s'il devrait ressusciter après avoir été détruit parce qu'il est nécessaire pendant la destruction d'autres singletons, et toutes ces bonnes choses.

+0

En effet, la question de la vie est difficile et ne devrait pas être sous-estimée, j'aime la politique de Phoenix :) –

1

Je ne vois pas l'avantage ici. Vous devez toujours implémenter la méthode getInstance() dans votre classe dérivée. Vous avez donc introduit des modèles et des héritages multiples, mais n'avez vraiment rien gagné. Le seul petit gain que je peux voir est que vous faites de tous vos singleton part une méthode commune, mais c'est un schéma si commun que je ne pense pas que ce soit un gain réel.

1

Votre singleton ne fonctionnera pas. Vous ne pouvez pas utiliser une méthode virtuelle pour renvoyer l'instance car elle ne peut être appelée qu'avec une instance. Vous avez besoin au minimum d'une méthode statique ou d'un objet intermédiaire qui implémente le singleton.

Vous devriez lire sur l'implémentation de singletons en C++ si vous prévoyez de le généraliser comme ceci. Cependant, mon conseil pour tout le code de la bibliothèque est de créer les implémentations simples et propres dont vous avez besoin en premier. Dans le cas singleton, il s'agirait simplement de l'implémenter comme une méthode statique sans héritage. Ensuite et seulement si vous l'avez implémenté un certain nombre de fois et que vous comprenez parfaitement toutes les motivations et les détails d'une implémentation abstraite, créez une bibliothèque pour cela. Créer des bibliothèques trop tôt est l'une des causes les plus importantes de bogues et de codes non maintenus.

Questions connexes