Interface x classe abstrata
Pergunta
Quando você usa uma interface e quando uma classe abstrata?
Resposta esperada
Interface: define um contrato (o que um tipo sabe fazer) sem nenhuma implementação nem estado. Um tipo pode implementar várias — é a ferramenta pra 'capacidades' ortogonais (`Comparable`, `Serializable`, `Closeable`). Prefira interface quando classes não relacionadas precisam expor o mesmo comportamento. Classe abstrata: compartilha implementação e estado entre subclasses relacionadas, com alguns métodos deixados abstratos pra elas completarem (padrão Template Method). Uma classe só pode estender uma. Use quando há uma hierarquia 'é um' real com código comum a fatorar. Muitas linguagens modernas borram a linha (interfaces com métodos default), mas o critério fica: contrato compartilhável por tipos diversos → interface; implementação + estado comum a uma família → abstrata. E, no geral, favoreça composição a qualquer uma das duas.
Por que perguntam isso
Pergunta pleno. Sinal bom: 'interface pra capacidade ortogonal', 'abstrata pra template method', e o lembrete de favorecer composição.