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: