Re: Re: [ruby-de] Problem Klassenvariable überschreiben
Oliver Mensinger <[email protected]>
| Newsgroups | gmane.comp.lang.ruby.german |
|---|---|
| Message-ID | <[email protected]> |
Hallo Winfried! Okay, jetzt ist klar warum! Also Deine letzte Loesung gefaellt mir sehr gut! Das werde ich mir gut merken! Genau, Konstanten muessen immer qualifiziert werden. Das Beispiel von Pit ist doch aber auch eine Loesung fuer Dein Problem (und braucht nicht die zu ueberschreibene Klasse): >class Vater2 > @name = "Heribert" > > def Vater2.name > return @name > end >end > >class Sohn2 < Vater2 > @name = "Thomas" >end Hier geht auch: puts "Vater2:" + Vater2.name puts "Sohn2:" + Sohn2.name Sehr schoene Loesung! Weisst Du denn zufaellig wie man ein Ueberschreiben von Methoden erzwingen kann?? Das Object#type gibt die Klasse des Objekts zurueck - ist fuer mich auch neu. Ich hatte Deine Anfrage als Anlass genommen, um in den Buechern nach allen denkbaren Moeglichkeiten zu sehen. Ich wuerde es so nicht machen, die Methode ist fuer mich nicht selbsterklaerend genug. Gruesse, Oliver. On Mon, 17 Jun 2002, Winfried Mueller wrote: >Hallo Oliver, > >mein Beispiel ist schlecht gewählt und verleitet natürlich sofort >dazu, ein Instanzvariable zu benutzen anstatt einer >Klassenvariable. Das ursprüngliche Problem ging aber in die >Richtung, wo eine Klassenvariable angebracht war: > >- snip -- ># Code nicht getestet, nur gerade eingehackt, um das Problem ># verständlich zu machen >class Word > @@pattern = Regexp( "" ) > def Word.isIt( line ) > if line =~ @@pattern > return TRUE > else > return FALSE > end > end >end > >class Section < Word > @@pattern = Regexp( "^Section(.*)$" ) >end > >class Type < Word > @@pattern = Regexp( "^type(.*)$" ) >end > >puts Section::IsIt( "Section hardware.isdn" ) >> TRUE >puts Type::IsIt( "type yesno" ) >> TRUE > >- snip -- > > >>verwenden, denn eine Klassenvariable ist auch fuer die Unterklassen global, >>deshalb kommt zwei mal der zuletzt zugewiesene Wert heraus. > >Ja, das ist mittlerweile auch meine Erklärung für das Phänomen. >Das ist jedoch nicht gerade erwartungskonform. Dazu in einer >weiteren Mail mehr. > >>Oder verwende eine Klassen-Konstante (wenn sich der Wert, also der Name, nicht >>mehr aendert), etwas so: >> >>class Person >> def Person.name >> type::NAME >> end >>end >> >>class Vater < Person >> NAME = "Heribert" >>end >> >>class Sohn < Person >> NAME = "Thomas" >>end >> >>puts Vater::NAME -> Heribert >>puts Sohn::NAME -> Thomas > >Das Beispiel funktioniert zwar so, aber nicht, wenn ich >Person.name benutze: > >puts Vater::name -> "unitialized constant NAME..." > >Genau das bräuchte ich aber für mein Beispiel. Der Grund, warum >das nicht geht, scheint zu sein, das man Konstanten in Klassen >immer vollqualifiziert angeben muß. Dann müßte man also in >Person.name schreiben "Person::NAME", was dann aber nicht korrekt >wäre, weil ja in der abgeleiteten Klasse "Vater::NAME" und >"Sohn::NAME" gefragt ist. > >Meine jetzige Lösung für das Problem sieht in etwa so aus: > >class Word > def pattern > #abstrakte Methode, sollte niemals aufgerufen werden > assert > end > > def Word.isIt( line ) > if line =~ pattern > #...weiterer Code... > return TRUE > else > return FALSE > end > end >end > >class Section < Word > def pattern > /^Section(.*)$/ > end >end > >class Type < Word > def pattern > /^type(.*)$/ > end >end > >puts Section::IsIt( "Section hardware.isdn" ) >> TRUE >puts Type::IsIt( "type yesno" ) >> TRUE > > >Im Grunde ist das eine Emulation einer echten Klassenvariable, in >der Form, wie sie mir aus der OO-Programmierung anderer Sprachen >bekannt ist. > >Ach ja, noch was: was bedeutet eigentlich "type::" in deinem >Beispiel? Das habe ich nicht verstanden. > > >..Winfried.. >_______________________________________________ >ruby-de mailing list >[email protected] >http://lists.bttr.org:8080/mailman/listinfo/ruby-de >