[quote=luistiagos]bem então neste exemplo:
interface A {
final static int x = 4;
}
a classe que implementar esta interface tera herdado a constante x…
dai neste ponto o argumento:
Mas que B implementa o contrato definido por A…
neste ponto B não ira implementar nenhum contrato definido por A ele ira herdar a constante de A…
[/quote]
Não é a toa que isso é considerado um anti-pattern. Aliás, um anti-pattern tão feio que é citado em especial no Effective Java.
E, novamente, você está pegando aspectos de uma implementação de uma linguagem, para tentar justificar um conceito. A linguagem Java permite esse tipo de aberração, que nada tem a ver com o conceito de interface.
A interface nada mais é do que um contrato entre duas classes. Nada mais. Esse é o conceito. E é exatamente por ser somente isso que elas são tão úteis.
Esse pode ser implementado de várias formas nas linguagens:
- No C++: Classes abstratas, só com métodos virtuais puros e através de extensão pública ou implicitamente em templates;
- No Java: Existe uma construção nativa para dar suporte ao conceito, chamada interface;
- No Groovy e Ruby: implicitamente em runtime, através de duck typing.
O C++ não tem um mecanismo nativo para a implementação do conceito de interfaces. Mas existem interfaces sim, pois há formas de utilizar esse conceito:
- Criar classes abstratas, sem propriedades, com um construtor vazio e só com métodos virtuais puros. Como a linguagem não dá suporte nativo, não há avisos para o programador caso ele venha a ferir essas regras, mas isso não significa que isso deixou de ser um erro de projeto. Herança múltipla nesse tipo de classe não está sujeita aos problemas do Diamond of Death e, do ponto de vista do projeto, passam a representar uma relação de contrato e não de tipos. Efetivamente, ao usar dessa forma, você deixou de fazer herança para usar interfaces;
- Usar templates e interfaces implícitas.
O que eu já ressaltei algumas vezes, e parece ser o que você está confundindo, é que o conceito é uma coisa, enquanto o mecanismo que implementa esse conceito é outra totalmente diferente. No C++, o mecanismo que se usa para criar uma interface e uma classe base é exatamente o mesmo. Porém, você só terá a interface caso siga certas regras, que a tornam útil.