Disons que je veux créer une interface pourComment faire des classes de base héritées utilisent une variable commune
Item
s qui ont un contenu qui peut être lu.Item
s qui ont un contenu qui peut être écrit.Item
s qui ont un contenu qui peut être lu une/o écrite
Cependant, je ne veux pas créer 3 classes abstraites que je veux passer un Item
, qui est en lecture accessible en écriture à une fonction qui accepte uniquement les éléments lisibles.
par exemple. vous ne pouvez lire qu'un Book
, donc Book
héritera de Readable
, alors qu'un Note
peut être lu et écrit, donc il héritera ReadWritable
.
Alors maintenant, je peux créer la fonction comme ça:
std::string read(Readable& readable) const
ou
void take_a_note(Writable& writable)
J'ai cette Readable
classe abstraite
template <typename ReadableType>
class Readable
{
public:
Readable(const ReadableType content);
virtual ~Readable(void);
virtual auto content(void) const noexcept -> const ReadableType&&;
private:
const ReadableType _content;
};
Et une classe abstraite Writable
template <typename WritableType>
class Writable
{
public:
Writable(void);
virtual ~Writable(void);
virtual void content(WritableType&& content) noexcept;
private:
WritableType _content;
};
Mais maintenant, je veux créer une classe abstraite qui combine les fonctionnalités, appelé ReadWritable
template <typename ReadWritableType>
class ReadWritable: public Readable<ReadWritableType>, public Writable<ReadWritableType>
{
public:
ReadWritable(ReadWritableType content);
virtual ~ReadWritable(void);
using Writable<ReadWritableType>::content;
using Readable<ReadWritableType>::content;
};
C'est là le problème est, comme content(WritableType&& content)
utilise Writable::_content
, tandis que content(void)
utilise Readable::_content
. Comment puis-je les faire utiliser le même membre _content
de données. Et si je peux le faire, y a-t-il un moyen de supprimer l'autre?
Ou mon approche complète est-elle incorrecte? Je suis ouvert à toutes les opinions.
Je ne suis pas sûr d'avoir bien compris votre question - Mais avez-vous jeté un coup d'œil sur le concept de classe de base virtuelle? Cela garantirait qu'il n'y a qu'un seul membre _content dans votre classe ReadWritable dérivée. – tofro
Je pensais que cela ne s'appliquait que si la classe de base était exactement la même base, par ex. si j'ai hérité de Readable deux fois. Le problème n'est pas vraiment qu'il y ait une surcharge, mais que Readable :: content() et Writable :: content() ont chacun leur propre variable privée '_content' et ne coordonnent pas – hgiesel
Interface et implémentation séparées. L'interface ne doit stocker aucun état et vous devez stocker tous les états dans l'implémentation. –