2009-02-22 7 views
20

Wie ich es verstehe, eine Schnittstelle ist Java soll ein Design erzwingen durch Auslegen von Methoden für Klassen implementieren die Schnittstelle zum Ausfüllen. Ist das die Idee mit einem Ruby-Modul auch? Ich sehe, dass man wie bei Interfaces in Java kein Modul in Ruby instanziieren kann.Ist ein Ruby-Modul einer Java-Schnittstelle äquivalent?

Antwort

7

Ich denke, ich würde ein Modul mit etwas ähnlicher als eine Erweiterungsmethode in C# gleichsetzen. Sie fügen einer vorhandenen Klasse, die an anderer Stelle definiert ist, Funktionen hinzu. Es gibt weder in C# noch in Java ein exaktes Analog, aber ich würde es definitiv nicht als Schnittstelle betrachten, da die Implementierung genauso wie die Schnittstelle abgeleitet ist.

+0

Zu meinem eigenen Vorteil, liege ich falsch in meiner Einschätzung? So habe ich sie bisher benutzt, vielleicht verpasse ich etwas. –

+0

Sie können ein Modul in eine Ruby-Klasse aufnehmen und dessen Verhalten, zumindest Instanzmethoden, erben. Schau dir http://www.ruby-doc.org/core/classes/Module.html an. – tvanfosson

+0

Das stimmt, ich wusste davon, ich benutze es nur selten im RPG-Maker. Danke, ich sehe den Punkt jetzt. –

3

Nein. Ein Modul in Ruby ähnelt mehr einer statischen Klasse. Ich bin kein Java-Entwickler, aber ich bin rate, dass Java-Schnittstellen C# -Schnittstellen ähnlich sind, d. H. Sie definieren einen Vertrag, aber keine Implementierung.

Ich sollte das nicht, während ich Erfahrung in Ruby habe, ist es in der Videospiel-Erstellung (RGSS/2). Ich bin sicher, dass ich viele Dinge nicht kenne, die ein erfahrener Ruby-Programmierer wissen würde.

+0

Wenn also ein 'Ruby'' Modul 'wie eine' Java' 'statische Klasse' ist, dann ist ein' Ruby' 'Modul' wie ein' C# '' Namespace'? – mmcrae

3

Ein Modul in Ruby ist ein bisschen Geltungsbereich/Namespace, der zu anderen Dingen hinzugefügt werden kann. Sie werden für zwei verschiedene, aber verwandte Zwecke verwendet: Bündeln eines Bündels verwandter Dinge (Konstanten, Klassen usw.), die zusammengehören und dann zu einem anderen Bereich hinzufügen (wie Mehrfachvererbung).

Zum Beispiel gibt es Module namens Dinge wie Vergleichbar und Aufzählbar usw., die die Funktionalität einkapseln, die man erwarten würde, wenn diese Adjektive angewendet würden. Durch die Bereitstellung einer grundlegenden Definition (eine Methode, die zwei Instanzen für Comparable und einen Iterator für Enumerable vergleicht) können Sie das Modul importieren und sich mit der vollständigen Schnittstelle finden.

Auf der anderen Seite gibt es Module wie Net, die Sie selten in einer Klasse enthalten würden, die aber ein Bündel von Funktionen wie Net :: HTTP, Net :: FTP, Net :: SMTP und so weiter zur Verfügung stellen.

In der Mitte gibt es Dinge wie Mathematik und Prozess, die auf die eine oder andere Weise verwendet werden können.

- MarkusQ

17

Die kurze Antwort ist nein.

Hier ist die Argumentation, eine Java/C# -Schnittstelle definiert die Methodensignaturen, die eine implementierende Klasse mindestens bereitstellen wird.

Zusätzlich:

  • Mit Rubin Module gibt es keinen solchen Vertrag wegen der Ente-Typisierung.
  • Module sind nur eine Möglichkeit, gängige Funktionen zur einfachen Wiederverwendung zu extrahieren. Die engste Beziehung sind C# -Erweiterungsmethoden, aber diese sind keine exakte Übereinstimmung, da sie in einem statischen Kontext existieren.
  • Module können den Status einer vorhandenen Klasse hinzufügen.
  • Module können statische Methoden haben
  • Module wie Namespaces

Beispiel dienen:

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