Java fa una chiara distinzione tra classe interface. (Credo che anche C # lo faccia, ma non ne ho esperienza). Quando si scrive C ++, tuttavia, non esiste alcuna distinzione imposta dal linguaggio tra classe e interfaccia.
Di conseguenza, ho sempre visto l'interfaccia come una soluzione alternativa per la mancanza di ereditarietà multipla in Java. Fare una tale distinzione sembra arbitrario e insignificante in C ++.
Ho sempre avuto la tendenza a seguire l'approccio "scrivere le cose nel modo più ovvio", quindi se in C ++ ho quella che si potrebbe chiamare un'interfaccia in Java, ad esempio:
class Foo {
public:
virtual void doStuff() = 0;
~Foo() = 0;
};
e ho quindi deciso che la maggior parte degli implementatori Foovoleva condividere alcune funzionalità comuni che avrei probabilmente scritto:
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);
};
Il che quindi non rende più questa un'interfaccia in senso Java.
Invece C ++ ha due concetti importanti, relativi allo stesso problema ereditario sottostante:
virtualinhertianceLe classi senza variabili membro non possono occupare spazio aggiuntivo se utilizzate come base
"Gli oggetti secondari della classe base possono avere dimensioni zero"
Di quelli che cerco di evitare al primo posto dove possibile - è raro imbattersi in uno scenario in cui questo è veramente il design "più pulito". # 2 è tuttavia una differenza sottile, ma importante tra la mia comprensione del termine "interfaccia" e le caratteristiche del linguaggio C ++. Di conseguenza, attualmente non mi riferisco (quasi) mai a cose come "interfacce" in C ++ e parlo in termini di classi di base e dimensioni. Direi che nel contesto di C ++ "interfaccia" è un termine improprio.
Mi è venuto in mente che non molte persone fanno una tale distinzione.
- Posso perdere qualcosa consentendo (ad es.
protected) Di nonvirtualfunzioni 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 puro
virtualo sarebbe corretto chiamare classi C ++ senza variabili membro un'interfaccia ancora?
~Foo() {}in una classe astratta è un errore in (quasi) ogni circostanza.
internalHelperThingpuò essere simulato in quasi tutti i casi.