0 votes

Abstrait une interface `ISingleton` pour en faire une classe de base

Je possède 3 classes d'interface IVideo , IAudio , IGPIO et trois autres classes qui implémenteront ces interfaces : Video_impl , Audio_impl , GPIO_impl.

Jusque-là, tout est simple.

Mais ensuite, je veux que tous ces objets soient des singletons. Voici les questions :

Est-ce une bonne idée d'abstraire une Interface ISingleton, de sorte que Video_impl , Audio_impl , GPIO_impl (ou IVideo , IAudio , IGPIO ?) peuvent en hériter ?

Je pensais l'implémenter de la manière suivante. Est-ce recommandé ? Je pense qu'il doit y avoir de meilleures façons.

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

};

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

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

3voto

Kaz Dragon Points 3460

Je recommanderais de lire "Modern C++ Design" d'Alexandrescu. Dans ce livre, entre autres choses, il conçoit un modèle de singleton complet et réfléchit à de nombreux problèmes, tels que quand il doit être détruit, s'il doit ressusciter après avoir été détruit car il est nécessaire pendant la destruction d'autres singletons, et tout ce genre de choses.

1voto

Glen Points 13521

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 l'héritage multiple, mais vous n'avez pas vraiment gagné grand-chose. Le seul petit avantage que je peux voir est que vous rendez tous vos singletons partagent une méthode commune, mais il s'agit d'un motif si commun que je ne pense pas que ce soit un réel gain.

1voto

iain Points 4876

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

Vous devriez vous renseigner sur l'implémentation des singletons en C++ si vous envisagez de le généraliser de cette manière. Cependant, mon conseil pour tout code de bibliothèque est de créer d'abord les implémentations simples et propres dont vous avez besoin. Dans le cas du singleton, il suffit de l'implémenter simplement comme une méthode statique sans héritage. Ensuite, seulement lorsque vous l'avez implémenté plusieurs fois et que vous comprenez pleinement toutes les motivations et les détails pour une implémentation abstraite, vous devriez créer une bibliothèque pour cela. Créer des bibliothèques trop tôt est l'une des principales causes de bogues et de code difficile à maintenir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X