Perché non creare una lingua con l'ereditarietà di mixin-only? [duplicare]

19

Sembra che in tutti i linguaggi OOP basati su classi o prototipi, i mixins siano una funzione secondaria o secondaria. Tuttavia, per me sembra che l'ereditarietà tradizionale sia solo un caso specifico di utilizzo di un singolo mixin.

Suppongo che ciò sia dovuto a motivi storici e alla familiarità, ma forse c'è qualcos'altro? Problemi con la condivisione dello stato incapsulato in modo sicuro?

    
posta Den 02.11.2015 - 13:07
fonte

1 risposta

31

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

  • Why not make a language with mixin-only inheritance?

    Jigsaw è tale lingua, così come Newspeak , lingua attuale di Bracha

  • However, to me it looks like traditional inheritance is just a specific case of using a single mixin.

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 ).

    
risposta data 02.11.2015 - 14:12
fonte