Java distingue chiaramente class
e interface
. (Credo che anche C # lo faccia, ma non ne ho esperienza). Tuttavia, quando si scrive C ++ non esiste una distinzione applicata tra linguaggio e classe.
Di conseguenza ho sempre considerato l'interfaccia come soluzione alternativa alla mancanza di ereditarietà multipla in Java. Fare una tale distinzione è arbitrario e privo di significato in C ++.
Ho sempre avuto la tendenza ad adottare l'approccio "scrivi le cose nel modo più ovvio", quindi se in C ++ ho quello che potrebbe essere chiamato un'interfaccia in Java, ad esempio:
class Foo {
public:
virtual void doStuff() = 0;
~Foo() = 0;
};
e ho quindi deciso che molti implementatori di Foo
volevano condividere alcune funzionalità comuni che probabilmente scriverei:
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);
};
Che quindi non rende più questa interfaccia in senso Java.
Invece il C ++ ha due concetti importanti, relativi allo stesso problema di ereditarietà sottostante:
-
virtual
inhertiance -
Le classi senza variabili membro non possono occupare spazio extra se usate come base
"Base class subobjects may have zero size"
Di quelli che cerco di evitare il numero 1 ovunque sia possibile - è raro imbattersi in uno scenario in cui questo è veramente il design "più pulito". # 2 è comunque una sottile, ma importante differenza tra la mia comprensione del termine "interfaccia" e le caratteristiche del linguaggio C ++. Come risultato di ciò, attualmente (quasi) non mi riferisco mai a cose come "interfacce" in C ++ e parlo in termini di classi base e loro dimensioni. Direi che nel contesto di C ++ "l'interfaccia" è un termine improprio.
Ho notato che non molte persone fanno una tale distinzione.
- Sono disposto a perdere qualcosa consentendo l'esistenza di funzioni non-
protected
(ad esempiovirtual
) all'interno di una "interfaccia" in C ++? (La mia sensazione è esattamente l'opposto - una posizione più naturale per il codice condiviso) - Il termine "interfaccia" è significativo in C ++ - implica solo solo %
virtual
o sarebbe corretto chiamare le classi C ++ senza alcuna variabile membro ancora un'interfaccia?