


![]() |
![]() |
![]() |
||||||||||||||||||||||||||||
|
Endspurt zum Forentreff: Forentreff - Fahrgemeinschaften, Abmeldungen, Auswärtige Vererbungen
Hi,
ist es eigentlich möglich über eine Methode eine Superklasse hinzuzufügen? Also das man z.B. nicht mehr das hier braucht class << Superclass. Mehr als a Allgäuer ka a Mensch it wera.
Fritz: Mama, Papa hat sich erhängt.
Mama: WAS?!? Wo denn? Fritz: Im Dachboden Mama. Beide gehen hoch. Mama: Aber Fritz, da ist er nicht. Fritz: April April, er hängt im Keller.
Klasse = Class.new(Elternklasse)
Also so:
Oder wie? WTF ist Mixins? :D Kannst du mjir das erkären Kai? Mehr als a Allgäuer ka a Mensch it wera.
Fritz: Mama, Papa hat sich erhängt.
Mama: WAS?!? Wo denn? Fritz: Im Dachboden Mama. Beide gehen hoch. Mama: Aber Fritz, da ist er nicht. Fritz: April April, er hängt im Keller.
Klasse = Class.new(Elternklasse)
Also so:
Oder wie? Nein. self bezieht sich hier auf die Instanz auf der Klasse. self = irgendwas gibt sowieso einen Error.
afaik sind das in Ruby include und extend. Maker-Fragen per PN sind nicht gern gesehen, sonst ->
Achtung, dieser Code erzeugt nach Foo.new eine völlig neue Klasse! Alle Methodendefinitionen der alten Klasse sind in dieser nicht mehr vorhanden. Überhaupt dürfte dieser Code eigentlich gar nicht ausgeführt werden können, da man Konstanten nicht innerhalb einer Funktion ändern darf. Aber evtl. sind frühere Rubyversionen da nicht so strikt. Ich weiß ja nicht was du genau machen willst. Aber wenn du Klassen zur Laufzeit neue Superklassen hinzufügen willst, musst du das mit Mixins lösen. Ein Mixin schiebt sich zwischen die Klasse und seiner Superklasse und wird sozusagen zur neuen Superklasse. Damit das funktioniert, darf das Mixin seinerseits natürlich keine eigene Superklasse haben, deswegen kann man nur Module als Mixins verwenden. Mal ein umfangreiches Beispiel =P
Was im Grunde genommen passiert, sobald du include aufrufst, ist das das Modul Flieger eine Art Mixin-Klasse erzeugt die Subklasse von Tier wird und zur neuen Superklasse von Vogel. Wichtig dabei ist: Du bekommst davon nichts mit. Vogel.superclass wird weiterhin Tier ausgeben. Wenn du aber Vogel.ancestors ausführst bekommst du die wahre Vererbungslinie ausgegeben. Du kannst beliebig oft include in einer Klasse ausführen. Beim zweiten include schiebt sich das zweite Modul vor das erste und wird zur neuen "Superklasse" deiner Klasse. Wichtig ist außerdem, dass ein Modul in beliebig viele Klassen included werden kann. Darum werden Mixins in erster Linie dann verwendet, wenn du Methoden hast, die du gerne mehreren Klassen zur Verfügung stellen möchtest, ohne das diese unbedingt von deiner Klasse erben müssen. Im obigen Beispiel könntest du die Flieger Klasse auch in die Klasse Flugzeug includen, obwohl Flugzeug und Vogel nicht sonderlich eng miteinander verwandt sind ^^ extend ist nichts anderes als
Auf die Weise kannst du einzelnen Objekten neue Eigenschaften vererben.
|
||||||||||||||||||||||||||||||
![]() |
![]() |
![]() |






