Java faz uma distinção clara entre class
e interface
. (Acredito que o C # também o faça, mas não tenho experiência com ele). Ao escrever C ++, no entanto, não há distinção imposta por linguagem entre classe e interface.
Consequentemente, sempre vi a interface como uma solução alternativa para a falta de herança múltipla em Java. Fazer essa distinção parece arbitrário e sem sentido em C ++.
Eu sempre tendi a seguir a abordagem "escrever as coisas da maneira mais óbvia"; portanto, em C ++, tenho o que pode ser chamado de interface em Java, por exemplo:
class Foo {
public:
virtual void doStuff() = 0;
~Foo() = 0;
};
e então decidi que a maioria dos implementadores Foo
queria compartilhar algumas funcionalidades comuns que provavelmente escreveria:
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);
};
O que torna isso não mais uma interface no sentido Java.
Em vez disso, o C ++ possui dois conceitos importantes, relacionados ao mesmo problema de herança subjacente:
virtual
herançaClasses sem variáveis de membro não podem ocupar espaço extra quando usadas como base
"Subobjetos da classe base podem ter tamanho zero"
Entre aqueles que tento evitar o número 1, sempre que possível - é raro encontrar um cenário em que esse seja realmente o design "mais limpo". O número 2 é, no entanto, uma diferença sutil, mas importante, entre o meu entendimento do termo "interface" e os recursos da linguagem C ++. Como resultado, atualmente (quase) nunca me refiro a coisas como "interfaces" em C ++ e falo em termos de classes base e seus tamanhos. Eu diria que, no contexto de C ++, "interface" é um nome impróprio.
Chegou ao meu conhecimento que muitas pessoas não fazem essa distinção.
- Posso perder alguma coisa permitindo que (por exemplo
protected
) não-virtual
funções existam em uma "interface" em C ++? (Meu sentimento é exatamente o oposto - um local mais natural para código compartilhado) - O termo "interface" é significativo em C ++ - implica apenas puro
virtual
ou seria justo chamar classes C ++ sem variáveis-membro de interface ainda?
~Foo() {}
em uma classe abstrata é um erro em (quase) todas as circunstâncias.
internalHelperThing
pode ser simulado em quase todos os casos.