Nella programmazione per computer, un mixin è una classe ereditata da un’altra classe ma non è pensata per essere istanziata. Una singola classe può ereditare molti mixin, quindi molte raccolte di funzioni possono essere consolidate facilmente. Sebbene molti linguaggi di programmazione comuni utilizzino la metodologia mixin, ce ne sono molti altri che non lo fanno, inclusi C++ e Java. In generale, i mixin si trovano nei linguaggi di scripting o in quei linguaggi che hanno la capacità di creare script, come JavaScript e Perl.
I mixin sono unici in quanto diventano parte di una sottoclasse durante la compilazione. I loro metodi e le loro costanti sono inclusi nella sottoclasse. Un’altra caratteristica unica delle classi mixin è che i metodi possono essere definiti e associati agli oggetti in fase di esecuzione. La maggior parte dei linguaggi utilizza un approccio diverso, associando e definendo metodi in fase di compilazione anziché in fase di esecuzione. Questa associazione di runtime consente ai mixin di essere molto flessibili.
Un problema comune nell’ereditarietà multipla è l’ambiguità nella chiamata di metodo e i mixin possono risolvere questo problema perché non seguono esattamente le stesse regole dell’ereditarietà multipla. Ad esempio, l’ereditarietà multipla può creare un cosiddetto “diamante della morte”, in cui una classe genitore A ha sottoclassi B e C e una classe D eredita da entrambe le classi B e C. Il problema in questo scenario è che i metodi che hanno lo stesso nome nelle classi A, B e C può essere ereditato nella classe D, creando più versioni dello stesso metodo senza distinzioni chiare. I mixin risolvono questo problema mantenendo distinta ogni versione del metodo, piuttosto che tentare di sovrascriverli come nell’ereditarietà multipla standard.
I mixin non sovrascrivono i metodi nelle classi in cui sono ereditati. Ad esempio, se una classe A definisce un metodo “myMethod” ed eredita un mixin B che definisce anche il metodo “myMethod”, entrambi questi metodi potrebbero ancora essere chiamati senza ambiguità e l’implementazione di “myMethod” nella classe A sarebbe ancora completamente accessibile. Il modo esatto in cui verrebbero chiamati questi metodi dipende dalla lingua in cui è implementato il mixin.
Alcuni linguaggi di programmazione che non utilizzano i mixin, come Java, utilizzano interfacce per imitarli. Le interfacce in questi linguaggi non emulano la piena funzionalità dei mixin, perché le interfacce possono contenere solo costanti e dichiarazioni di metodo. I mixin, d’altra parte, possono contenere implementazioni complete di metodi. Quei linguaggi che non supportano i mixin hanno spesso alternative praticabili che possono essere persuase a fare più o meno la stessa cosa.