2013-06-03 2 views
21

Quali sono le somiglianze & differenze tra tratti, mixins e interfacce. Sto cercando di ottenere una comprensione più profonda di questi concetti, ma non conosco abbastanza linguaggi di programmazione che implementino queste funzionalità per capire veramente le somiglianze e le differenze.Tratti vs. Interfacce vs. Mixin?

Per ciascuno dei tratti, mixins e interfacce

  • qual è il problema viene risolto?
  • La definizione del concetto è coerente tra i linguaggi di programmazione?
  • Quali sono le somiglianze tra questo e gli altri?
  • quali sono le differenze tra questo e gli altri?
+1

Scala ha dei tratti solo (mixins e interfacce sarebbero compresi dalla tratti).Guardando il tuo profilo sembra che tu abbia uno sfondo Java. Dovresti provare Scala, scoprirai che i tratti sono molto utili quando vuoi mescolare alcune implementazioni che sono ortogonali alla tua classe attuale. È più difficile fare bene quando vuoi impilare i tratti. Vedi http://www.artima.com/pins1ed/traits.html per maggiori dettagli. – huynhjl

+0

@ams: dai un'occhiata a questa [risposta] (http://stackoverflow.com/a/23124968/33311). Potrebbe essere utile anche se è taggato "groovy". – Lernkurve

risposta

10

Ogni reference type in Java, eccetto Object, deriva da una singola superclasse.

proposito, classi Java possono implementare zero o più interfacce.

in generale, l'interfaccia è un contratto che descrive i metodi di una classe che implementa è costretto ad avere, anche se senza fornire direttamente un'implementazione.

In altre parole, una classe Java è obbligata a rispettare il proprio contratto e quindi a dare attuazione alle firme di metodo fornite dalle interfacce che dichiara di implementare.

Un'interfaccia costituisce un tipo. Quindi è possibile passare parametri e avere valori di ritorno da metodi dichiarati come tipi di interfaccia, richiedendo in questo modo che i parametri ei tipi di ritorno implementino metodi particolari senza necessariamente fornire un'implementazione concreta per essi.

Questo imposta la base per diversi modelli di astrazione, come, ad esempio, dependency injection.

Scala, di per sé, ha dei tratti. I tratti forniscono tutte le funzionalità delle interfacce Java, con la differenza significativa che possono contenere implementazioni e variabili del metodo. I tratti sono un modo intelligente di implementare i metodi una sola volta e, attraverso questo, distribuire questi metodi in tutte le classi che estendono il tratto. Come le interfacce per le classi Java, puoi mescolare più di un tratto in una classe Scala.

Poiché non ho alcuna Rubino sfondo, però, ti puntare a un estratto da "Inizio Scala" di David Pollak (amazon link):

Ruby ha mixins, che sono collezioni di metodi che possono essere mescolato in qualsiasi classe. Poiché Ruby non ha una tipizzazione statica e non c'è modo di dichiarare i tipi di parametri del metodo, non esiste un modo ragionevole per utilizzare i mixin per definire un contratto come le interfacce. Le mixine di Ruby forniscono un meccanismo per comporre il codice in classi ma non un meccanismo per definire o applicare i tipi di parametri.

Le interfacce possono fare anche più di quanto descritto in questo post; Dal momento che l'argomento può essere vasto, ti suggerisco di investigare di più in ognuna delle tre direzioni, mentre se hai persino uno sfondo Java, Scala e quindi i tratti sono accessibili per imparare.

+0

È necessario chiarire che ogni tipo di * refererence * deriva da Object. I primitivi no. Vorrei rimuovere la frase "Come si dice ampiamente su Internet ..." o fornire alcuni link a articoli ben noti. – coltfred

+1

@coltfred: modifica completata. –

+0

Non sono d'accordo con Pollak, in primo luogo "non esiste un modo ragionevole per utilizzare i mixin per definire un contratto come interfacce" - [un contratto è * principalmente * sui * metodi *] (https://www.eiffel.com/values/design -by-contract/introduction /), così fa. In secondo luogo "non un meccanismo per la definizione o l'applicazione dei tipi di parametri" - Ruby utilizza la digitazione anatra e la denominazione dei metodi per questo. Vedi [questa risposta per ulteriori] (http://stackoverflow.com/a/177127/335847) – iain