Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Classe abstracta vs interface

Olá,

Em vez de utilizarmos o método percentualTarifa() como abstract e colocarmos a class Conta a abstract, poderíamos em vez disso criar um interface como esse método e obrigar as classes filhas de conta que precisam do método a implementar essa interface?

Não consigo distinguir bem quando é que é melhor usar uma classe abstracta ou uma interface, talvez possa ajudar a esclarecer.

Obrigado

4 respostas

Ola André, Tudo bem contigo?

1) Em vez de utilizarmos o método percentualTarifa() como abstract e colocarmos a class Conta a abstract, poderíamos em vez disso criar um interface como esse método e obrigar as classes filhas de conta que precisam do método a implementar essa interface?

Sim poderia ser feito desta forma.

2) Não consigo distinguir bem quando é que é melhor usar uma classe abstracta ou uma interface, talvez possa ajudar a esclarecer.

Uma Interface permite aplicar um método a coisas não relacionadas e obter o mesmo resultado. Através de Interfaces temos a capacidade de exigir que classes não relacionadas implementem um conjunto de métodos comuns.

Um exemplo que pode te ajudar:

Imagine que você tem uma classe Carro. Esta classe tem 2 classes filhas, 2 modelos/marcas de carros, BMW e Wolkswagen. A classe Carro implementa alguns atributos comuns para todos os carros, por exemplo, por exemplo volante, rodas e outros. E implementa métodos comuns a todos os carros como Acelerar e Frear.

Nas classes filhas, mais especificas você implementa atributos daquele modelo, exemplo, motorização, vidro elétrico e assim por diante. Ou seja qualquer coisa que se pareça com Carro, vai sempre herdar desta classe base, sejam atributos ou métodos.

Agora imagine que você tem uma outra classe chamada Barco. E existem classes filhas, categorias de barcos, BarcoVela e Lancha. Mesmo caso.

Imagine que tanto para Carros como Barcos, você deseja implementar uma função ou método chamado CustodeFabricação, que levanta todos os custos para fabricar seja um carro ou barco de um modelo ou categoria especifico.

Se este método estiver em Carro, isto vai limitar o uso do método por que uma categoria de Barco não pode herdar de Carro, um barco não tem nada a ver com Carro, não tem o atributo rodas, ou o método frear por exemplo.

Assim a solução é implementar uma Inteface.

A forma interna de calcular o custo de fabricação de um carro é totalmente diferente da forma de calcular o custo de um barco. Assim cada classe vai implementar a Interface do seu modo. Entretanto no meu sistema eu quero simplesmente chamar o método CustodeFabricaçao, não importa se o meu objeto é barco, carro ou avião, embora sejam classes bem diferentes, o que eu quero no final é um valor total em dinheiro.

Assim existem momentos em que eu posso criar atributos e metodos em classes abstratas, quando os tipos são parecidos, haverá relação de herança. Mas quando os objetos são muito diferentes, são construidos e se comportam de modos diferentes eu posso definir uma interface, que independente do tipo, eu obtenha um resultado único, quando isto fizer sentido.

Por favor, se este texto te ajudou marcar este tópico como solucionado ou se não, poste tuas dúvidas. É importante que você não somente pergunte as coisas, mas que de retorno, observe que tem um outro tópico ai que te respondi e você não deu retorno.

Bons estudos,

Olá, André.

Consegue postar aqui uma implementação dessa sua sugestão? Eu não entendi muito bem o que você quis dizer...

Marco António, Imagine o banco quer implementar uma bonificação de 0.5% de sobre o saldo quando a conta do cliente faz 20 anos de idade com o mesmo banco. Poderia ser feita uma interface nesse caso que chamaria o método percentualTarifa(), embora com propósitos algo distintos? Já que um é para retirar um percentil do saldo quando há um saque e outro é para dar um bonus de percentil quando a conta faz aniversario de 20 anos?

No caso explicado na aula qual é a melhor estratégia a aplicar? Classe abstrata ou interface?

Obrigado

solução!

Olá André,

Marco António, Imagine o banco quer implementar uma bonificação de 0.5% de sobre o saldo quando a conta do cliente faz 20 anos de idade com o mesmo banco. Poderia ser feita uma interface nesse caso que chamaria o método percentualTarifa(), embora com propósitos algo distintos?

Não. O resultado do método tem de ser o mesmo, tem de ter um mesmo propósito. Quando você usa Interfaces as classes são distintas, mas o retorno do método tem de ser o mesmo.

Já que um é para retirar um percentil do saldo quando há um saque e outro é para dar um bonus de percentil quando a conta faz aniversario de 20 anos? Não, embora o calculo seja o mesmo, a finalidade é distinta. Tem de ser 2 métodos diferentes.

No caso explicado na aula qual é a melhor estratégia a aplicar? Classe abstrata ou interface? Classe abstrata. Pois o método percentualTarifa é aplicado em classes filhas, herdam da classe Conta, e dai em cada tipo seja ContaCorrente ou ContaPoupança implementam o método. Mas aqui as classes são do tipo Conta, e existe relação de herança.

O mesmo para CalculaBonificação, que trata de classes descendentes de Funcionario.

Agora se você tivesse um método que quisesse implementar tanto para Conta como para Funcionario, por exemplo valorPatrimonio. No caso de Conta retornaria o valor de em saldo, e para Funcionario retornasse o valor somado dos ultimos 3 salarios. Dai as classes implementariam uma Interface e para cada uma faria seus calculos. Mas o retorno do método seria igual para os dois casos, um total em dinheiro indicando o Patrimonio da Conta ou de um Funcionario baseado no seus ultimos 3 salários.

PS: Não se esqueça de se for o caso fechar este tópico, como solucionado. Dependendo do assunto abrir outro tópico.