2009-02-22 7 views
20

A quanto ho capito, un'interfaccia è Java ha lo scopo di imporre un progetto estendendo i metodi per le classi che implementano l'interfaccia da compilare. È questa l'idea anche con un modulo Ruby? Vedo che, proprio come con Interfaces in Java, non è possibile creare un'istanza di un modulo in Ruby.È un modulo Ruby equivalente a un'interfaccia Java?

risposta

7

Penso che equiparerei un modulo a qualcosa di più simile a un metodo di estensione in C#. Stai aggiungendo funzionalità a una classe esistente che è effettivamente definita altrove. Non esiste un analogo esatto né in C# né in Java, ma sicuramente non lo considererei un'interfaccia perché l'implementazione è derivata così come l'interfaccia.

+0

Per il mio beneficio qui, ho sbagliato nella mia valutazione? È così che li ho usati fino ad ora, forse mi sto perdendo qualcosa. –

+0

È possibile includere un modulo in una classe Ruby ed ereditare il suo comportamento, almeno i metodi di istanza. Dai un'occhiata a http://www.ruby-doc.org/core/classes/Module.html – tvanfosson

+0

È vero, lo sapevo, lo uso solo raramente in rpg maker. Grazie, vedo il punto ora. –

3

No. Un modulo in rubino è più simile a una classe statica. Non sono uno sviluppatore Java, ma sono indovinando che le interfacce Java sono simili alle interfacce C#, cioè definiscono un contratto, ma non un'implementazione.

Non dovrei, mentre ho esperienza nel ruby, è nella creazione di videogiochi (RGSS/2). Sono sicuro di non conoscere molte cose che un veterano programmatore di rubini avrebbe saputo.

+0

quindi se un '' ruby' 'è come una' static' '' Java', allora un 'ruby'' module' come un 'C#' 'namespace'? – mmcrae

3

Un modulo in ruby ​​è un po 'di ambito/spazio dei nomi che può essere aggiunto ad altre cose. Vengono utilizzati per due scopi distinti ma correlati: raggruppare un gruppo di cose correlate (costanti, classi, ecc.) Che appartengono insieme e quindi aggiungerle in qualche altro ambito (come l'ereditarietà multipla).

Ad esempio, ci sono moduli chiamati cose come Comparable ed Enumerable e così via che racchiudono la funzionalità che ci si aspetterebbe che qualcosa avesse se questi aggettivi fossero applicati. Fornendo una definizione di base (un metodo che confronta due istanze per Comparable e un iteratore per Enumerable) è possibile importare il modulo e ritrovarsi con l'interfaccia completa.

D'altra parte ci sono moduli come Net che raramente includeresti in una classe ma che forniscono un insieme di funzionalità come Net :: HTTP, Net :: FTP, Net :: SMTP e così via.

Nel mezzo ci sono cose come Math e Process che potrebbero essere usate in un modo o nell'altro.

- MarkusQ

17

La risposta breve è no.

Ecco il ragionamento, un'interfaccia Java/C# definisce le firme del metodo che una classe di implementazione fornirà al minimo.

Inoltre:

  • Con i moduli rubino non esiste tale contratto a causa della anatra tipizzazione.
  • I moduli sono solo un modo per estrarre funzionalità comuni per un facile riutilizzo. La relazione più vicina è i metodi di estensione C#, ma quelli non sono una corrispondenza esatta poiché esistono in un contesto statico.
  • I moduli possono aggiungere lo stato a una classe esistente.
  • moduli possono avere metodi statici
  • moduli possono agire come namespace

Esempio:

module SimpleConversation 
    class NamespacedExample 
    def poke 
     puts "ouch" 
    end 
    end 

    attr_accessor :partner_name 
    def converse 
    partner_name ||= "Slowpoke" 
    speak + "\n#{partner_name}: Yes they are" 
    end 

    def self.yay 
    puts "yay" 
    end 
end 

class Foo 
    include SimpleConversation 
    attr_accessor :name 

    def speak 
    name ||= "Speedy" 
    "#{name}: tacos are yummy" 
    end 
end 

x = Foo.new 
x.name = "Joe" 
x.partner_name = "Max" 
puts x.speak 
puts x.converse 

y = SimpleConversation::NamespacedExample.new 
y.poke 

SimpleConversation.yay