Bom dia Francisco,
Para entender isso, é bom saber o que cada um te dá como vantagens. Pense que em uma estrutura de Herança, você estará não só herdando comportamentos (métodos), mas atributos também. Ok, se você criar uma classe abstrata e só declarar métodos abstratos nela, todas filhas desta terão que implementar tudo, logo vira o mesmo que se fosse uma interface, e por isso mesmo que se for este o caso, acredito que usar as interfaces é mais indicado.
Vamos nos lembrar de conceitos vitais da OO:
Em herança, um Objeto filho É DO TIPO do Objeto pai. Um cachorro É UM animal.
Em composição, um Objeto SE COMPORTA como ALGO. Eu posso ser um Objeto B, do Tipo A (B extends A), e ainda assim me comportar de outras formas C, D e E (implements C, D, E). Eu me comportar de uma determinado forma, semanticamente não quer dizer que eu SOU aquilo, apenas me COMPORTO daquela forma quando necessário.
Em ambos você ganha Polimorfismo, mas muitas vezes o Polimorfismo ganho através da Composição é o que faz mais sentido semântico. É altamente recomendado evitar utilizar Herança, apenas se realmente é um cenário claro e está é a única solução. Heranças são fáceis de fazer virarem monstros, estender demais e deixar ela muito mais complexa do que deveria, programando para interfaces é uma forma mais desacoplada e de fácil manutenção.
Claro, cada caso um caso e requer análise para decidir o mais indicado, mas em linhas gerais, é bom ter isso tudo em mente.
Espero ter ajudado, qualquer dúvida manda ai, abraço.