465 Stimmen

Unterschied zwischen einer Klasse und einem Modul

Ich komme von Java, und jetzt arbeite ich mehr mit Ruby.

Ein Sprachmerkmal, mit dem ich nicht vertraut bin, ist die module . Ich frage mich, was genau ist ein module und wann verwenden Sie eine, und warum verwenden Sie eine module über eine class ?

31 Stimmen

546voto

Sergii Shevchyk Punkte 37348
                class                      module                          

 instantiation  can be instantiated        can *not* be instantiated       

 usage          object creation            mixin facility. provide         
                                             a namespace.                  

 superclass     module                     object                          

 methods        class methods and          module methods and              
                  instance methods           instance methods              

 inheritance    inherits behaviour and can No inheritance                  
                  be base for inheritance                                  

 inclusion      cannot be included         can be included in classes and  
                                             modules by using the include  
                                             command (includes all         
                                             instance methods as instance  
                                             methods in a class/module)    

 extension      can not extend with        module can extend instance by   
                  extend command             using extend command (extends 
                  (only with inheritance)    given instance with singleton 
                                             methods from module)

429voto

scottru Punkte 5130

Die erste Antwort ist gut und gibt einige strukturelle Antworten, aber ein anderer Ansatz ist, darüber nachzudenken, was man tut. Bei Modulen geht es darum, Methoden bereitzustellen, die Sie über mehrere Klassen hinweg verwenden können - betrachten Sie sie als "Bibliotheken" (wie Sie sie in einer Rails-App sehen würden). Bei Klassen geht es um Objekte, bei Modulen um Funktionen.

Authentifizierungs- und Autorisierungssysteme sind beispielsweise gute Beispiele für Module. Authentifizierungssysteme funktionieren über mehrere App-Level-Klassen hinweg (Benutzer werden authentifiziert, Sitzungen verwalten die Authentifizierung, viele andere Klassen verhalten sich je nach Authentifizierungsstatus unterschiedlich), sodass Authentifizierungssysteme als gemeinsame APIs fungieren.

Sie können auch ein Modul verwenden, wenn Sie Methoden für mehrere Anwendungen gemeinsam nutzen (auch hier ist das Bibliotheksmodell gut geeignet).

100voto

Linan Punkte 1138

Ich bin überrascht, dass das noch niemand gesagt hat.

Da der Fragesteller aus einem Java-Hintergrund kommt (und ich auch), ist hier eine Analogie hilfreich.

Klassen sind einfach wie Java-Klassen.

Module sind wie statische Java-Klassen. Denken Sie über Math Klasse in Java. Sie instanziieren sie nicht und verwenden die Methoden der statischen Klasse wieder (z. B. Math.random() ).

42voto

hurcane Punkte 1161

Grundsätzlich kann das Modul nicht instanziiert werden. Wenn eine Klasse ein Modul einschließt, wird eine Proxy-Superklasse erzeugt, die Zugriff auf alle Methoden des Moduls sowie auf die Methoden der Klasse bietet.

Ein Modul kann von mehreren Klassen aufgenommen werden. Module können nicht vererbt werden, aber dieses "Mixin"-Modell bietet eine nützliche Art der "Mehrfachvererbung". OO-Puristen werden mit dieser Aussage nicht einverstanden sein, aber lassen Sie sich nicht von der Reinheit abhalten, wenn es darum geht, die Arbeit zu erledigen.


(Diese Antwort war ursprünglich verlinkt mit http://www.rubycentral.com/pickaxe/classes.html aber dieser Link und seine Domain sind nicht mehr aktiv).

12voto

apadana Punkte 11390

Namensraum: Module sind Namensräume ...die es in Java nicht gibt ;)

Ich bin auch von Java und Python zu Ruby gewechselt, ich erinnere mich, dass ich genau die gleiche Frage hatte...

Die einfachste Antwort ist, dass Modul ein Namespace ist, den es in Java nicht gibt. In Java ist das dem Namespace am nächsten kommende Mindset ein Paket .

Ein Modul in Ruby ist also wie ein Modul in Java:
Klasse? No
Schnittstelle? No
abstrakte Klasse? No
Paket? Ja (vielleicht)

statische Methoden innerhalb von Klassen in Java: dasselbe wie Methoden innerhalb von Modulen in Ruby

In Java ist die kleinste Einheit eine Klasse, man kann keine Funktion außerhalb einer Klasse haben. In Ruby ist dies jedoch möglich (wie in Python).

Was also gehört zu einem Modul?
Klassen, Methoden, Konstanten. Das Modul schützt sie unter diesem Namensraum.

Keine Instanz: Module können nicht zur Erstellung von Instanzen verwendet werden

Gemischte Einsätze: Manchmal sind Vererbungsmodelle nicht für Klassen geeignet, aber im Hinblick auf die Funktionalität wollen Sie eine Reihe von Klassen/Methoden/Konstanten zusammenfassen.

Regeln für Module in Ruby:
- Modulnamen werden in Großbuchstaben geschrieben
- Konstanten innerhalb von Modulen werden in ALL CAPS geschrieben (diese Regel gilt für alle Ruby-Konstanten, nicht speziell für Module)
- Zugriffsmethoden: use . operator
- Zugriff auf Konstanten: use :: symbol

einfaches Beispiel für ein Modul:

module MySampleModule
  CONST1 = "some constant"

  def self.method_one(arg1)
    arg1 + 2
  end
end

wie man Methoden innerhalb eines Moduls verwendet:

puts MySampleModule.method_one(1) # prints: 3

wie man Konstanten eines Moduls verwendet:

puts MySampleModule::CONST1 # prints: some constant

Einige andere Konventionen über Module:
Ein Modul in einer Datei verwenden (wie Ruby-Klassen, eine Klasse pro Ruby-Datei)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X