Duvida sobre Interface versus Herança

Hoje em dia existe uma tendência ao abandono da herança.

Muitos dizem que é melhor o uso de interfaces ao invés de herança.

Porém, eu estou acostumado a usar herança e a indéia de interfaces apresenta algumas dificuldades para mim.

Exemplo:

Imaginem uma interface ICarro.
Essa interface tem os métodos Acelerar e Freiar.

Até aí tudo bem. Esse é um dos exemplos clássicos que os especialistas gostam de mostrar.
Cada classe implementará essas rotinas de forma específica, pois uma BMW é diferente de um Fusca.

Mas, imaginem que eu preciso de um metodo QtdRodas, que retorne sempre o número 4.
(vamos simplificar e esquecer dos carros mais futuristas. consideremos que semrpe serão 4 rodas)

Se fosse herança de classes, eu simplesmente criaria esse método na super classe uma única vez.
As classes herdeiras herdariam esse método e o meu trabalho nesse sentido estaria pronto.

Mas como estou usando Interfaces, vou ser obrigado a codificar esse método em todas as classes que implementam a minha interface, todas com o mesmo resultado…

Isso parece improdutivo.

Existe alguma forma de melhorar isso sem o uso de herança ??

Depende, nunca generalize, cada caso é um caso.

Mas na dúvida opte sempre por utilizar interfaces, suas classes podem implementar N interfaces, mas extender somente a uma única classe. Nada impere vc de ter a interface e a classe abstrata. Mas veja que em algum caso a sua interface ICarro, pode ser utilizada para uma moto, pois as motos também freiam e aceleram, e vc não vai sofrer drasticamente para alterar isso caso esteja usando interfaces, basta que sua classe moto implemente ICarro.

Procure sempre se abstrair, vc pode criar uma classe abstrata que ja implemente o metodo getRodas da interface ICarro, e fazer todos os seus carros extenderem a essa classe, e no caso de uma moto vc pode usar somente a interface.

[]'s

No problema que vc citou, realmente herança seria mais indicado.

O ponto fundamental é saber quando se deve usar herança e quando se deve usar interface , e pq não as duas juntas. Tudo depende do seu requisito e da sua forma de modelar o sistema.

Acho que se vc estudar os padrões de projeto GOF vão te abrir bastante a mente quanto a utilização de interfaces e herança nos mais variados casos.

Lembre-se que não é Herança OU Interface.

Vc pode, e deve, utilizar os 2.

public class BMW extends Veiculo implements ICarro {}

Em Veiculo poderia ter o qtd de rodas… eu poderia criar uma classe Moto, herdando de Veiculo, mas que NAO implementa ICarro.

Acelerar e freiar tb estariam em veiculo, pois todo veiculo faz isso.

Já na interface ICarro deveriam estar coisas específicas de um Carro. (é complicado da um exemplo de comportamento especifico de um carro, pq praticamente tudo que se faz num Carro se faz num Caminhao ou Onibus, por exemplo)

Mas acho que vc entendeu.

Lembre-se tb que, Herança é o conceito de É-UM. (envolve atributos e estado tb)
Interface é algo do tipo ESTA-HABILITADO-A

No conceito de OO, existem classes concretas e abstradas.

Classes concretas implementam todos os métodos definidos e podem ser instanciadas.

Classes abstratas possuem um ou mais métodos não implementados, por isso não podem ser instanciadas.

Devido ao fato do Java não suportar heranças múltiplas, criou as interfaces.

Uma interface é simplesmente uma classe PURAMENTE abstrata. Ou seja, não existe implementação de métodos e todos devem ser implementados nas classes que implementam a interface.

Interfaces não vão contra a herança de forma alguma, são complementares.

Caso você tenha uma classe sem métodos implementados, pode dar preferência ao uso de Interface. Caso sua classe possua métodos implementados, use Classe.

Não esqueça da regra de ouro “É - UM” quando for usar herança.

Obrigado a todos.