Il documento seminale su mixin è la Gilad Bracha 's PhD thesis Il linguaggio di programmazione Jigsaw: Mixins, Modularity e Multiple Eredità .
Ha risposte a tutte le tue domande, come
In effetti, l'ereditarietà di mixin sussume tutte le forme classiche di ereditarietà singola (di classe) (ereditarietà in stile Simula / Smalltalk e prefisso in stile Beta), nonché ereditarietà basata su classi multiple con linearizzazione (CLOS, C ++ , Python, ...)
Potresti dare un'occhiata a Newspeak. Non fatevi ingannare dal fatto che ha "classi". Sono in realtà mixins. Il Jigsaw paper descrive come le classi possono essere elevate ai mixin, e questo è esattamente come funziona in Newspeak.
Fondamentalmente, un mixin è una classe che non conosce la sua superclasse. Pertanto, può apparire in più punti nell'albero di ereditarietà. (Si noti che questa è non eredità multipla! In effetti è, in un certo senso, esattamente l'opposto o il doppio: nell'ereditarietà multipla, una classe appare in un singolo posto con più superclassi, in mixin ereditarietà, una classe appare in più posti con una singola superclasse.)
In Newspeak, OO è portato all'estremo: tutto è un messaggio di invio ("metodo virtuale / chiamata di funzione" in Javanese / C ++). Anche la ricerca della superclasse. Quindi, quando dichiari una classe Sub
come sottoclasse di Super
, la superclasse di Sub
non è memorizzata all'interno di qualche puntatore nell'implementazione interna di Sub
, no, ogni volta che hai bisogno della superclasse (es. Durante il messaggio dispatch (metodo / ricerca del metodo / dispatch in Javanese / C ++), il runtime interpreta Super
come nome di un metodo da chiamare che restituisce una classe. Tuttavia, non è noto in runtime quale classe restituisca. In effetti, potrebbe restituire una classe diversa ogni volta! Pertanto, le classi in Newspeak non conoscono la loro superclasse, che è la / una definizione di un mixin.
Si noti che in un linguaggio basato su prototipi, l'idea di avere un mixin dedicato non ha senso. L'intero punto di un linguaggio basato sul prototipo è che esiste un solo tipo di "cose" (oggetti) rispetto a due tipi di "cose" (oggetti e classi, oggetti e tratti, oggetti e mixini, ...). Loro possono essere usati come Pattern Design, naturalmente. È così che sono stati originariamente inventati, dopo tutto, nel sistema di oggetti Flavors per Lisp, che aveva classi con ereditarietà multipla, ma le classi erano spesso usate in un modo particolare, che chiamavano mixin (e da cui il sistema oggetto prendeva il nome ).