Schrift
[thread]6612[/thread]

Problem bei Objekten in Klassenvariablen (Seite 2)



<< |< 1 2 >| >> 14 Einträge, 2 Seiten
esskar
 2005-01-06 00:38
#50607 #50607
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=m1chaeL-,05.01.2005, 23:31]Warum klappt es manchmal (bei einfachen Datentypen) auch mit dem return $class?[/quote]
hmm; dass kann eigentlich nicht gehen
bzw. was natürlich geht

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
use strict;

package a;
sub new
{
 my ($class) = @_;
 return $class;
}

sub f { print "hallo\n"; }

1;
my $a = new a();
$a->f();


das benutzt aber das object nicht, sondern greifst einfach so auf die funktionen in dem package zu - (jaja, OO perl ist schon seltsam)

PS: wow, das hab ich mir grad selbst beigebracht. *g*\n\n

<!--EDIT|esskar|1104964767-->
m1chaeL-
 2005-01-06 00:43
#50608 #50608
User since
2005-01-06
5 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich drehe hier gerade durch ^^, in der anderen Klasse hatte ich aus irgendeinem mysteriösen Grund return $self;
ist halt doch schon spät :)
Quem te Deus esse Jussit et humana qua parte locatus es in re, Disce
esskar
 2005-01-06 03:34
#50609 #50609
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=m1chaeL-,05.01.2005, 23:43]aus irgendeinem mysteriösen Grund return $self;[/quote]
hmm... vielleicht weil es richtig ist? :)
du hast hoffentlich auch das bless korrigiert?
Strat
 2005-01-07 00:12
#50610 #50610
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=m1chaeL-,05.01.2005, 23:31]Warum klappt es manchmal (bei einfachen Datentypen) auch mit dem return $class?[/quote]
solange du keine attribute hast, funktioniert return $class auch, nur rufst du die methode dann nicht als objektmethode (d.h. auf das Objekt $self), sondern als Klassenmethode (auf die Klasse $class) auf, was ein ziemlicher unterschied ist, weil du in $self zwar was speichern kannst, in $class aber nur der Klassenname als skalarer wert steht.

$class->new() uebergibt den Namen der Klasse als ersten Parameter
$object->new() uebergibt das Objekt als ersten parameter

manchmal sieht man in einem konstruktor (z.B. ->new) folgende zeilen
Code: (dl )
1
2
3
4
5
6
sub new {
my $proto = shift;
my $class = ref($proto) || $proto;

bless ({}, $class);
}

die zeile:
my $class = ref($proto) || $proto ist da interessant:
wenn z.B. $object->new()
dann liefert ref($proto) den Namen der Klasse des objektes;
wenn $class->new()
dann liefert ref($proto) eine leere zeichenkette, weil ja der Klassenname ein string ist und keine referenz, dadurch wird das || ausgewertet und $proto (d.h. der Klassenname) dann $class zugewiesen.

aber so einen dualen konstruktor (als klassen- und objektmethode) finde ich nicht schoen; wenn man ein objekt klonen will, kommt meistens $object->clone() besser...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2005-01-05 23:36.