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