Java fait une distinction claire entre classet interface. (Je crois que C # fait aussi, mais je n'ai aucune expérience avec cela). Cependant, lors de l'écriture de C ++, il n'y a pas de distinction imposée par le langage entre la classe et l'interface.
Par conséquent, j'ai toujours considéré l'interface comme une solution de contournement pour le manque d'héritage multiple en Java. Faire une telle distinction semble arbitraire et dénué de sens en C ++.
J'ai toujours eu tendance à adopter l'approche "écrire les choses de la manière la plus évidente", donc si en C ++ j'ai ce qu'on pourrait appeler une interface en Java, par exemple:
class Foo {
public:
virtual void doStuff() = 0;
~Foo() = 0;
};
et j'ai alors décidé que la plupart des implémenteurs de Foovoulaient partager des fonctionnalités communes que j'écrirais probablement:
class Foo {
public:
virtual void doStuff() = 0;
~Foo() {}
protected:
// If it needs this to do its thing:
int internalHelperThing(int);
// Or if it doesn't need the this pointer:
static int someOtherHelper(int);
};
Ce qui fait que ce n'est plus une interface au sens de Java.
Au lieu de cela, C ++ a deux concepts importants, liés au même problème d'héritage sous-jacent:
virtualhéritageLes classes sans variable membre ne peuvent occuper aucun espace supplémentaire lorsqu'elles sont utilisées comme base
"Les sous-objets de la classe de base peuvent avoir une taille nulle"
De ceux que j'essaie d'éviter le n ° 1 dans la mesure du possible - il est rare de rencontrer un scénario où c'est vraiment la conception la plus "propre". # 2 est cependant une différence subtile mais importante entre ma compréhension du terme "interface" et les fonctionnalités du langage C ++. À la suite de cela, je ne me réfère actuellement (presque) jamais aux choses comme des "interfaces" en C ++ et je parle en termes de classes de base et de leurs tailles. Je dirais que dans le contexte de C ++ "interface" est un terme impropre.
Il a cependant été porté à mon attention que peu de gens font une telle distinction.
- Dois-je perdre quelque chose en autorisant (par exemple
protected) des non-virtualfonctions à exister dans une "interface" en C ++? (Mon sentiment est exactement le contraire - un emplacement plus naturel pour le code partagé) - Le terme «interface» a-t-il un sens en C ++ - cela signifie-t-il uniquement pur
virtualou serait-il juste d'appeler une classe C ++ sans variable membre une interface?
~Foo() {}dans une classe abstraite est une erreur dans (presque) toutes les circonstances.
internalHelperThingpeut être simulé dans presque tous les cas.