Thread Ein paar Fragen zur Objektorientierung (4 answers)
Opened by Sven_123 at 2011-03-17 11:24

Sven_123
 2011-03-17 11:24
#146589 #146589
User since
2010-06-01
120 Artikel
BenutzerIn
[default_avatar]
Zum Einstieg wollte ich einen kleinen Würfel erschaffen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
class wuerfel{
 has $.augen is rw;
 method anschubsen{
  $.augen = (20.rand+0.5).round;
 }
}

my $drachentoeter = wuerfel.new;
$drachentoeter.anschubsen;
say $drachentoeter.augen;

So wie es da steht, funktioniert auch alles, allerdings hab ich, ausgehend von der Version im Perl6-Tutorial, etwas basteln müssen und ich kann nicht ganz nachvollziehen, warum.
Ursprünglich hatte ich es mit einem bloßen has $.augen; versucht, und das twigil . in Anschubsen weggelassen, also $augen = (20.rand+0.5).round; (genaugenommen wollte ich auch 20.rand.ceil benutzen, aber ceil ist anscheinend noch nicht richtig implementiert).
Lässt man das is rw weg, beschwert sich rakudo, dass man einen readonly-value beschreiben möchte. Ist das gewollt? Denn eigentlich beschreibt ihn ja anschubsen, also eine Methode der Klasse... Ich dachte is rw bräuchte ich nur, wenn ich außerhalb der Klasse $drachentoeter.augen = 1; schreiben möchte.
Ohne den . wird $augen einfach als neue Variable erkannt ("Symbol '$augen' not predeclared in anschubsen..."). Ist es also generell so, dass Twigils mitgeführt werden müssen? Bei @*ARGS ist es z.B. ja auch so, nur war das Beispiel im Tutorial hier ohne.

Zum Schluss die hauptsächliche, eher generelle Frage, die ich habe:
Was genau passiert beim Aufrufen des Konstruktors? Ich hab kaum Erfahrung mit Objektorientierung, so, wie ich mir das zur Zeit vorstell wird im Endeffekt nur in $drachentoeter ein Zeiger gespeichert, der auf einen Platz irgendwo im Speicher (im heap vermutlich, aber bei perl hat man damit ja eh nichts zu tun) zeigt, der so groß ist, dass eine wuerfel-Instanz drin gespeichert werden kann. Der Minimale Konstruktor, den ich grad mit kurzem Ausprobieren, ausgehend von dem "Using Perl 6"-Buch gefunden hab wäre:
Code (perl): (dl )
method new{return self.bless(*)}

Eigentlich kann ich nur mit bless und dem * nichts anfangen. Ich schätze, dass bless die Speicherzuweisung übernimmt, aber wozu ist der Stern da?
Was ich eigentlich machen will, ist, gleich, wenn ich ein Objekt instantiiere (heißt das so?*g) eine Methode auszuführen. Ich weiß nur nicht so richtig, wie ich das schreiben soll, mit return endet ja mein new, aber vor dem return hab ich noch gar keine Instanz in der ich die Methode ausführen könnte, oder? (Zumindest funktioniert es so nicht...)
Last edited: 2011-03-17 12:13:12 +0100 (CET)

View full thread Ein paar Fragen zur Objektorientierung