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,