Java fait une distinction claire entre class
et 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 Foo
voulaient 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:
virtual
hé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-virtual
fonctions à 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
virtual
ou 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.
internalHelperThing
peut être simulé dans presque tous les cas.