bgBanner
Banner Banner aktuelles POTMaktuelles POTM letztes POTMletztes POTM vorletztes POTMvorletztes POTM Banner
left right right

You are not logged in.

Hindi

hat beim Stromkonzern schon Rabatt

  • "Hindi" started this thread

Motto: würde auch am 32. Dezember posten

2 Auszeichungen

  • Send private message

1

Saturday, March 13th 2010, 1:55pm

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.

2

Saturday, March 13th 2010, 3:43pm

ruby sourcecode

1
Klasse = Class.new(Elternklasse)
Ob man die Elternklasse/superclass nach der Erstellung eines Class-Objekts ohne weiteres (soll heißen, es ist möglich durch Umwege, aber über Nebenwirkungen müsste man sich Gedanken machen) ändern kann, weiß ich nicht.

3

Saturday, March 13th 2010, 5:13pm

Dafür gibt es doch Mixins.

RMXP Grundkurs
1 2 3
Ruby/RGSS-Kurs

Hindi

hat beim Stromkonzern schon Rabatt

  • "Hindi" started this thread

Motto: würde auch am 32. Dezember posten

2 Auszeichungen

  • Send private message

4

Saturday, March 13th 2010, 6:22pm

Klasse = Class.new(Elternklasse)
Also so:

ruby sourcecode

1
2
3
4
5
class Bla
  def initialize()
    self = Class.new(Superclass)
  end
end

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.

Motto: Wer anderen eine Bratwurst brät, der hat ein Bratwurstbratgerät.

5 Auszeichungen

  • Send private message

5

Saturday, March 13th 2010, 6:35pm

Klasse = Class.new(Elternklasse)
Also so:


ruby sourcecode

1
2
3
4
5
class Bla
  def initialize()
    self = Class.new(Superclass)
  end
end

Oder wie?

Nein. self bezieht sich hier auf die Instanz auf der Klasse. self = irgendwas gibt sowieso einen Error.

ruby sourcecode

1
2
3
4
5
class Foo
 def initialize
  Foo = Class.new(Object)
 end
end


Quoted

WTF ist Mixins? :D
Kannst du mjir das erkären Kai?
afaik sind das in Ruby include und extend.
Maker-Fragen per PN sind nicht gern gesehen, sonst ->

Hindi

hat beim Stromkonzern schon Rabatt

  • "Hindi" started this thread

Motto: würde auch am 32. Dezember posten

2 Auszeichungen

  • Send private message

6

Saturday, March 13th 2010, 6:39pm

Ok danke :D
Klappt einwandfrei :D
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.

7

Saturday, March 13th 2010, 10:49pm

ruby sourcecode

1
2
3
4
5
class Foo
 def initialize
  Foo = Class.new(Object)
 end
end

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.

Quoted

WTF ist Mixins? :D
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

ruby sourcecode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
class Lebewesen
 
  def stelle_dich_vor
    print "Ich bin ein Lebewesen!"  
  end
 
end
 
class Tier < Lebewesen
 
  def stelle_dich_vor
    print "Ich bin ein Tier!"
    super() 
  end
 
end
 
class Vogel < Tier
 
  def stelle_dich_vor
    print "Ich bin ein Vogel!"
    super() 
  end
 
  def fliege_nach(ziel)
    print "Ich fliege nach #{ziel}"
  end
 
end
 
amsel = Vogel.new
amsel.stelle_dich_vor
#=> Ich bin ein Vogel
#=> Ich bin ein Tier
#=> Ich bin ein Lebewesen
 
amsel.fliege_nach("Berlin")
#=> Ich fliege nach Berlin
 
module Flieger
  def stelle_dich_vor
    print "Ich bin ein Flieger!"
    super()
  end
 
  def bereise_folgende_orte(orte)
    orte.each do |ort|
      fliege_nach(ort)
    end
  end
 
  def heimat=(heimatort)
    @heimat = heimatort
  end
 
  def fliege_nach_haus
    fliege_nach(@heimat)
  end
end
 
class Vogel < Tier
  include Flieger
end
 
amsel.stelle_dich_vor
#=> Ich bin ein Vogel
#=> Ich bin ein Flieger
#=> Ich bin ein Tier
#=> Ich bin ein Lebewesen
 
amsel.bereise_folgende_orte(["Hamburg", "München", "Köln"])
#=> Ich fliege nach Hamburg
#=> Ich fliege nach München
#=> Ich fliege nach Köln
 
amsel.heimat = "Düsseldorf"
amsel.fliege_nach_haus
#=> Ich fliege nach Düsseldorf
 
module Zweibeiner
 
  def stelle_dich_vor
    print "Ich bin ein Zweibeiner"
    super()
  end
 
end
 
class Vogel < Tier
  include Zweibeiner
end
 
amsel.stelle_dich_vor
#=> Ich bin ein Vogel!
#=> Ich bin ein Zweibeiner
#=> Ich bin ein Flieger!
#=> Ich bin ein Tier!
#=> Ich bin ein Lebewesen!


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

ruby sourcecode

1
2
3
class << self
  include Foo
end


Auf die Weise kannst du einzelnen Objekten neue Eigenschaften vererben.

ruby sourcecode

1
2
3
4
5
6
7
8
9
10
11
module Singvogel
  def sing
    print "zwitscher"
  end
end
 
amsel.extend(Singvogel)
amsel.sing #=> zwitscher
 
geier = Vogel.new
geier.sing #=> NoMethodError!

RMXP Grundkurs
1 2 3
Ruby/RGSS-Kurs

bottom bottom bottom