На уровне, не зависящем от языка, миксин просто добавляет функциональность в класс, и это больше для удобства программиста и во избежание дублирования кода. Абстрактный (базовый) класс формирует отношение is-a и допускает полиморфизм. Одна из причин чрезмерного использования наследования заключается в том, что это простой способ реализации миксинов без написания шаблонов на языках, которые их не поддерживают. Проблема в том, что вы объявляете полиморфные отношения как побочный эффект, что делает ваш API более запутанным и, возможно, добавляет двусмысленность. Следовательно, новые языки, такие как D и Ruby, поддерживают миксины в качестве нативных функций, что позволяет удобно добавлять группы функций в класс, не объявляя полиморфные отношения is-a.