Java fa una chiara distinzione tra class
e 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 Foo
voleva 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:
virtual
inhertianceLe 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 nonvirtual
funzioni 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
virtual
o sarebbe corretto chiamare classi C ++ senza variabili membro un'interfaccia ancora?
~Foo() {}
in una classe astratta è un errore in (quasi) ogni circostanza.
internalHelperThing
può essere simulato in quasi tutti i casi.