2011-02-22 8 views
16

Sto cercando di avvolgere la mia testa attorno a Ruby, e una cosa a cui sto combattendo è la mancanza di un'interfaccia/supporto astratto di classe. Da Google su Google, la risposta che vedo continuamente per astrarre domande correlate a Ruby è "Stai pensando in Java. Ruby non funziona in questo modo""Interfacce e classi astratte non necessarie in Ruby" -> Qualcuno può spiegare?

Quindi, come si potrebbe lavorare in Ruby senza interfacce/classi astratte?

Per esempio, in Java mi potrebbe creare una classe di "libro" astratto, con sottoclassi "romanzo", "libro di testo", e "rivista". C'è un sacco di funzionalità comuni che inserisco nel "libro", ma non voglio che sia direttamente accessibile - un libro deve essere un romanzo, un libro di testo o un diario.

In ruby, come faccio a scrivere questo genere di funzionalità?

+1

Ecco una domanda simile con alcune risposte veramente bello: http://stackoverflow.com/questions/512466/how-to-implement-an-abstract-class-in-ruby –

+0

gli spazi dei nomi org.java e org.jruby giocano molto bene insieme (: –

risposta

19

Sono anch'io iniziatore di Ruby. Dalla mia comprensione, c'è un rivale più vicino per le classi astratte in rubino. ovvero module. non puoi creare alcuna istanza di modulo ma puoi includerla con un'altra classe. Quindi, una classe di destinazione otterrà l'intera funzionalità del genitore

module Log 
    def write 
     //blah 
    end 
    end 

    class EventLog 
    include Log 

    def Prepare 
    end 
    end 

In linguaggi staticamente tipizzati come Java/C#, Interfacce rispettare le classi per avere tutti i metodi in fase di compilazione. Dato che Ruby è dinamico, non ha alcun significato.

Per maggiore chiarezza, controllare questi posti perché i linguaggi dinamici non richiedono interfacce ..

  1. why-dont-we-require-interfaces-in-dynamic-languages
  2. why-do-dynamic-languages-like-ruby-and-python-not-have-the-concept-of-interfaces

Acclamazioni

+5

Questi sono chiamati mixins (edit: un tipo di mixin, in questo caso 'include' colpisce metodi di istanza, mentre è anche possibile utilizzare' extend' che interesserà classe metodi ... spero di averlo spiegato correttamente), se ricordo bene, in sostanza, il modulo fornisce funzionalità che devono essere condivise tra più classi, ma non è di per sé una classe: in questo modo non è possibile creare un'istanza di un modulo Libro, ma tu può creare un'istanza di una classe Journal che include il modulo Book. – nil

+0

@nil, sì hai assolutamente ragione .. I moduli sono mixin. – RameshVel

+0

Molte grazie Ramesh. :-) – PlankTon

Problemi correlati