No existe respuesta correcta a una pregunta tan genérica

. La respuesta es: "depende". A veces va mejor una cosa, a veces otra. Por ejemplo, si es algo que controlas tú totalmente, usar herencia no suele ser un problema por que tú sabes exactamente para qué la vas a usar, que clases heredarán de ahí etc.
En cambio si otra gente ha de implementar servicios tuyos, si usas herencia les obligas a crear clases nuevas que hereden de la tuya, no pueden usar clases suyas que hereden de otra cosa. Pero si tus clases tienen muuuuchos metodos opcionales que pueden o no implementarse, con composicion tienen que escribir todos esos metodos de nuevo y no hacer nada con ellos, en cambio con herencia cojen la implementación del padre por defecto....
Así que... depende

.