Boa tarde, herança e relacionamento quando devo usar um e não o outro?
Boa tarde, herança e relacionamento quando devo usar um e não o outro?
Boa noite, Raphael! Como vai?
De modo geral, vc pode usar o seguinte critério para se guiar:
Sua classe precisa herdar comportamentos ou atributos predefinidos? Então utilize herança! Caso contrário utilize uma interface!
Exemplo Prático
Situação 1: Tenho uma classe ServicoHttp
que sabe responder toda e qualquer requisição do protocolo HTTP. Mas eu preciso ter uma classe que também saiba se comportar desse jeito respondendo a todos os tipos de requisição HTTP, mas ao mesmo tempo preciso customizar a forma de atender o verbo GET
desse protocolo!
Veja que a classe ServicoHttp
já tem implementado dentro dela todos os atributos ( IP de quem está fazendo a requisição, por exemplo ) e todos os comportamentos ( formas de responder a todos os tipos de requisição HTTP ). Então tudo que eu preciso fazer na nova classe é herdar todos esses atributos e métodos, apenas sobrescrevendo o método que trata a requisição do tipo GET
! Ficaria algo assim:
public class ServicoHttp {
// declaração dos atributos omitida.
public void executaGet(Requisicao req, Resposta resp) {
// implementa a forma padrão de responder uma requisição do tipo GET.
}
// implementação padrão dos demais tipos de requisição HTTP.
}
public class CustomHttp extends ServicoHttp {
@Override
public void executaGet(Requisicao req, Resposta resp) {
// implementa a forma customizada de responder uma requisição do tipo GET.
}
}
Situação 2: Suponha agora que eu tenho uma classe ImpostoDeRenda
e outra ImpostoSobreServico
. Ambas as classes precisam implementar um método que recebe um valor qualquer e executam as suas respectivas lógicas de cálculo! Nesse caso eu usaria uma interface afinal de contas não desejo herdar nada de ninguém! E teríamos algo assim:
public interface Imposto {
public double calcula(double valor);
}
public class ImpostoDeRenda implements Imposto {
public double calcula(double valor) {
// implementação da lógica do cálculo de IR.
}
}
public class ImpostoSobreServico implements Imposto {
public double calcula(double valor) {
// implementação da lógica do cálculo de ISS.
}
}
Pegou a ideia? Qualquer coisa é só falar!
Grande abraço e bons estudos, meu aluno!