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
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.
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.
Wenn also ein 'Ruby'' Modul 'wie eine' Java' 'statische Klasse' ist, dann ist ein' Ruby' 'Modul' wie ein' C# '' Namespace'? – mmcrae
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
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
Aus formaler Sicht Module in Ruby implementieren Design Muster "mixin" genannt. http://en.wikipedia.org/wiki/Mixin
Es kann mit PHP-Merkmalen verglichen werden. http://php.net/manual/en/language.oop5.traits.php
Eine solche Architektur ist in Sprachen nützlich, die keine Mehrfachvererbung erlauben, z.B. Rubin, PHP.
Zu meinem eigenen Vorteil, liege ich falsch in meiner Einschätzung? So habe ich sie bisher benutzt, vielleicht verpasse ich etwas. –
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
Das stimmt, ich wusste davon, ich benutze es nur selten im RPG-Maker. Danke, ich sehe den Punkt jetzt. –