Thread Vererbung
(2 answers)
Opened by Sven_123 at 2012-11-08 12:01
1. Kann ich auf irgendeine Weise auf in der BUILD-Routine der Kindklasse auf Attribute der Elternklasse zugreifen? Die Attribute als named parameters mit zu übergeben (in folgendem Code method BUILD(:$!legs) {}) reicht allein zumindest nicht...:
Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 use v6; class pet { has $.legs = 4; } class spider is pet { method BUILD {$!legs = 8} } my $robert = spider.new(); say $robert.legs; _______________________________________________________________________________ Edit: Die 2 hab ich verstanden - ich muss das bless der Kindklasse das $l auch benannt weitergeben lassen, das der Elternklasse wird ja gar nicht mehr aufgerufen. Also ebenfalls: submethod new($l) {return self.bless(*, :$l)}. 2. Wie schaff ich es, eine Instanz einer Kindklasse zu erzeugen, indem ich dem new() eine Instanz der Elternklasse übergebe? Da die BUILD-Routine dann ja von beiden Klassen aufgerufen wird, muss ich doch bei der Elternklasse einfach eine Vorschrift einbauen, wie sie aus sich selbst erzeugt wird. Wenn ich das so versuche, wie im nächsten Beispiel, wird $l in der animal-Klasse allerdings beim zweiten Aufruf nicht als animal(), sondern als Any() übergeben, woher das kommt, weiß ich nicht...(wie die Syntax für eine multisubmethod aussieht, hab ich nicht rausgefunden, bei einem multi submethod() {} kam ein anderer Fehler, deswegen der Umweg über die multis im BUILD). Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 use v6; class animal { has $.legs; submethod new($l) {return self.bless(*, :$l)} submethod BUILD(:$l) { legify($l); multi legify(Int $l) {$!legs = $l} multi legify($l) {$!legs = $l.legs} } } class pet is animal { has $.name is rw; submethod new($x) {return self.bless(*)} } my $spider = animal.new(8); say $spider.legs; $spider = pet.new($spider); say $spider.legs; Last edited: 2012-11-08 13:55:53 +0100 (CET) |