Java hace una clara distinción entre class
y interface
. (Creo que C # también lo hace, pero no tengo experiencia con eso). Sin embargo, al escribir C ++ no existe una distinción forzada por el lenguaje entre la clase y la interfaz.
En consecuencia, siempre he visto la interfaz como una solución para la falta de herencia múltiple en Java. Hacer tal distinción se siente arbitrario y sin sentido en C ++.
Siempre tendí a seguir el enfoque de "escribir cosas de la manera más obvia", por lo que si en C ++ tengo lo que podría llamarse una interfaz en Java, por ejemplo:
class Foo {
public:
virtual void doStuff() = 0;
~Foo() = 0;
};
y luego decidí que la mayoría de los implementadores de Foo
quería compartir alguna funcionalidad común que probablemente escribiría:
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);
};
Lo que hace que esto ya no sea una interfaz en el sentido de Java.
En cambio, C ++ tiene dos conceptos importantes, relacionados con el mismo problema de herencia subyacente:
virtual
inerciaLas clases sin variables miembro no pueden ocupar espacio adicional cuando se usan como base
"Los subobjetos de la clase base pueden tener un tamaño cero"
De los que trato de evitar # 1 siempre que sea posible, es raro encontrar un escenario en el que ese sea realmente el diseño "más limpio". Sin embargo, el n. ° 2 es una diferencia sutil pero importante entre mi comprensión del término "interfaz" y las características del lenguaje C ++. Como resultado de esto, actualmente (casi) nunca me refiero a cosas como "interfaces" en C ++ y hablo en términos de clases base y sus tamaños. Yo diría que en el contexto de C ++ "interfaz" es un nombre inapropiado.
Sin embargo, me ha llamado la atención que no mucha gente hace tal distinción.
- ¿Debo perder algo al permitir (por ejemplo
protected
) que novirtual
existan funciones dentro de una "interfaz" en C ++? (Mi sensación es exactamente lo contrario: una ubicación más natural para el código compartido) - ¿Es significativo el término "interfaz" en C ++? ¿Implica solo puro
virtual
o sería justo llamar a las clases de C ++ sin variables miembro una interfaz todavía?
~Foo() {}
en una clase abstracta es un error en (casi) todas las circunstancias.
internalHelperThing
se puede simular en casi todos los casos.