10 votes

Retourner un type abstrait dans une classe de base

Dans la conception d'une hiérarchie de classes, j'utilise une classe de base abstraite qui déclare diverses méthodes que les classes dérivées doivent mettre en œuvre. En un sens, la classe de base est aussi proche d'une interface qu'on peut l'être en C++. Cependant, il y a un problème spécifique. Considérons le code ci-dessous qui déclare notre classe d'interface :

class Interface {
public:
    virtual Interface method() = 0;
};

class Implementation : public Interface {
public:
    virtual Implementation method() { /* ... */ }
};

Bien sûr, cela ne compilerait pas, car on ne peut pas retourner une classe abstraite en C++. Pour contourner ce problème, j'utilise la solution suivante :

template <class T>
class Interface {
public:
    virtual T method() = 0;
};

class Implementation : public Interface<Implementation> {
public:
    virtual Implementation method() { /* ... */ }
};

Cette solution fonctionne et est très bien, mais, pour moi, elle n'est pas très élégante, en raison du bout de texte redondant qui serait le paramètre de l'interface. Je serais heureux si vous pouviez me signaler tout autre problème technique lié à cette conception, mais c'est ma seule préoccupation à ce stade.

Existe-t-il un moyen de se débarrasser de ce paramètre de modèle redondant ? Peut-être en utilisant des macros ?

Nota: La méthode en question doit retourner une instance. Je suis conscient que si method() a renvoyé un pointeur ou une référence, il n'y aurait pas de problème.

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