Ruby/Klasse

Aus Scientia
Wechseln zu: Navigation, Suche

Jedes Objekt in Ruby ist Instanz einer Klasse. In der Klasse werden die Methoden definiert, die dann von den Instanzen der Klasse ausgeführt werden können. Weiterhin bieten Klassen mit ihrer new-Methode eine Möglichkeit an neue Instanzen von sich zu erzeugen.

Man kann sich eine Klasse wie einen Bauplan vorstellen. Die Klasse String beispielsweise ist ein Bauplan für alle String-Objekte. Sie legt fest welche Methoden die String-Objekte beherrschen und bietet eine new-Methode mit der neue Strings erzeugt werden können. Will man eigene Programme schreiben ist es oft unerlässlich neue Klassen anzulegen.

Anlegen von Klassen

# Definition der Klasse
class Klassenname
 
  # die initialize-Methode wird beim Anlegen einer Instanz automatisch aufgerufen
  # da jede Klasse ihre initialize Methode von Object erbt, ist die Definition dieser Methode optional
  def initialize
    # hier kann irgendein Code geschrieben werden
    # der dann für jede Instanz nach deren Erzeugung ausgeführt wird
  end
 
  # eine Klasse darf beliebig viele weitere Instanzmethoden definieren
  def methode1 argument1, argument2
    # irgendein Inhalt
  end
end
 
# Erzeugen von Instanzen dieser Klasse
ein_objekt = Klassenname.new
 
# aufrufen von Instanzmethoden
ein_objekt.methode1("argument", "noch ein argument")

Vererbung

Jede Klasse, mit Ausnahme der Object Klasse, hat eine Superklasse von der sie ihre Eigenschaften und Methoden erbt. Gibt man beim Anlegen einer Klasse keine Superklasse an, so wird automatisch die Object Klasse als Superklasse verwendet. Eine Klasse erbt die Instanzmethoden, Klassenmethoden, Sichtbarkeiten, Konstanten und Klassenvariablen von ihrer Superklasse. Man bezeichnet sie auch als Subklasse oder Tochterklasse ihrer Superklasse. Der Vorgang der Vererbung ist oftmals ein Vorgang der Spezialisierung. Man definiert eine Superklasse so, dass sie für möglich viele Anwendungszwecke nutzbar ist. Ihre Subklassen werden dann so definiert, dass sie auf die einzelnen Anwendungszwecke zugeschnitten sind. Der Vorteil liegt dabei darin, dass jene Eigenschaften, die auch für die anderen Anwendungszwecke gelten, nicht in jeder Subklasse noch mal definiert werden müssen, da dies bereits in der Superklasse geschehen ist.

Um bei der Klassendefinition eine Superklasse anzugeben, schreibt man nach dem Klassennamen ein < gefolgt vom Namen der Superklasse.

Beispiel:

# Da hier keine Superklasse angegeben wird, wird automatisch
# Object die Superklasse von Person
class Person
  def initialize name
    @name = name
  end
 
  def vorstellen
    "Ich bin #{@name}"
  end
end
 
# Die Klasse Magier wird als Subklasse von Person definiert
# sie erbt daher alle Methoden und Eigenschaften
class Magier < Person
  def vorstellen
    "#{super}, ein mächtiger Magier"
  end
 
  def zaubern
    "*zaubertrick vorführ*"
  end
end
 
person = Person.new("Alex")
print person.vorstellen #=> Ich bin Alex
 
zauberer = Magier.new("Merlin")
print zauberer.vorstellen #=> Ich bin Merlin, ein mächtiger Magier
print zauberer.zaubern #=> *zaubertrick vorführ*

In diesem Beispiel wurde erst eine Klasse Person angelegt. Sie bekam eine initialize Methode, die dafür sorgt dass die Instanz beim Erzeugen einen Namen bekommt, sowie eine Methode um sich vorzustellen. Ein Magier ist eine spezielle Person, daher wurde die Klasse Magier als Subklasse von Person angelegt. Es ist nicht notwendig erneut eine initialize Methode zu schreiben, da die Klasse Magier die initialize Methode von Person erbt. Man kann nun die Klasse Magier um neue Methoden erweitern, zum Beispiel der Methode zaubern. Oder aber man überschreibt Methoden der Superklasse und erweitert diese. Dies ist bei der Methode vorstellen geschehen.

Definiert eine Subklasse eine gleichnamige Methode wie in der Superklasse, so wird diese Methode überschrieben. Das heißt es wird nur noch die Methode der Subklasse ausgeführt. Innerhalb dieser Methode kann man aber das Schlüsselwort super verwenden. Es bewirkt, dass die gleichnamige Methode der Superklasse ausgeführt wird. Lässt man nach super die Klammern weg, so wird die Methode der Superklasse mit denselben Argumenten aufgerufen wie die Methode der Subklasse. Ansonsten kann man aber auch in Klammern die gewünschten Argumente für die Methode der Superklasse hinter das super-Schlüsselwort schreiben.

Im obigen Beispiel wurde die Methode vorstellen überschrieben. Die Methode gibt stattdessen einen eigenen String zurück, bestehend aus dem Ergebnis-String der Superklassenmethode ("Ich bin #{@name}") und dem zusatz ", ein mächtiger Magier".


Ruby verwendet das Prinzip der Einfachvererbung. Das bedeutet dass jede Klasse nur genau eine Superklasse haben darf. Es ist nicht möglich mehrere Superklassen anzugeben. Eine Möglichkeit einer Klasse dennoch Eigenschaften von mehreren anderen Quellen zu vererben sind Mixins.


Sonstiges

Der Klassenname ist eine Konstante. Daher muss der erste Buchstabe des Klassennamens groß geschrieben werden. Da Klassen selbst auch nur Objekte sind, kann man sie auch an andere Variablen binden.

# eine weitere Konstante definieren, die auf diese Klasse zeigt:
Zeichenkette = String
test = Zeichenkette.new("ein Test")
 
# lokale Variablen definieren, die auf eine Klasse zeigen
strklass = String
test = strklass.new("ein Test")

Es ist auch möglich Klassen an etwas anderes als Konstanten zu binden, z.B. an lokale Variablen. Eine Klasse die nicht an eine Konstante gebunden ist, bezeichnet man auch als anonyme Klasse.

# legt eine konstantengebundene Klasse mit dem Namen MeineKlasse an
MeineKlasse = Class.new
# dies ist äquivalent zur Syntax
class MeineKlasse2
 
end
 
# lege nun eine Klasse an, die an eine lokale Variable gebunden ist
# und eine Subklasse von String ist
meineklasse = Class.new(String) do
  def eine_instanzmethode
  end
end
 
# lege eine Instanz dieser anonymen Klasse an
ein_objekt = meineklasse.new()
ein_objekt.eine_instanzmethode()

Verwandte Themen