1) Fiquei na dúvida quando usar interface ou classe abstrata diretamente.
Porque me parece que todas as classes abstratas que criamos poderiam ter sido interfaces.
Porém pensei o seguinte:
Se eu tiver uma classe que tem métodos com implementações e ao mesmo tempo tenho métodos que não quero implementar (e sim deixar as classes filhas implementarem) eu uso classe abstrata (exemplo: abstract class Pessoa
) pois ai ela consegue ter os dois.
E quando eu tiver uma suposta classe que na verdade eu veja que não será implementado nenhum dos seus métodos ai eu uso interface (exemplo: interface Autenticavel
)?
Mesmo pensando isso cai naquele dilema de novo, para que usar classe abstrata então se todos os métodos que são abstratos eu poderia colocar em uma interface?
2) O professor disse que existe um conceito na programação sobre usar sempre abstrações, nesse caso eu poderia usar sempre interface e não seria necessário mais herança? Herança é errado usar pois ela tem uma implementação já para o método?
3) Na classe Autenticador passamos como parâmetro a interface Autenticavel:
A minha dúvida é que, como não estamos trabalhando com herança nesse caso, então Autenticavel não é uma classe mãe. Então eu não poderia dizer por exemplo que "Gerente é um Autenticável como digo que Gerente é um Funcionário", certo? Pergunto isso para entender como que na hora de testar, eu passando um Gerente/Diretor/Funcionario ele entende que seria do mesmo tipo da interface Autenticável: