Die OOP kam mit am anfang auch etwas komisch vor. Aber irgendwann macht es klick, und man sieht dass es wirklich total Simpel ist.
Ein Objekt in Perl ist nichts anderes als eine Referenz die noch zusätzlich an ein Package gebunden wird.
Stell dir eine Referenz folgendermaßen vor. "HASH(0x123456)" halt der ganz normale String den man bekommt, wenn man eine Referenz letztendlich mit print ausgibt. Ein Objekt ist ebenfalls nur eine Referenz, allerdings steht noch zusätzlich dabei in welchem Package Funktionen gesucht werden sollen, wenn man "->" auf diese Referenz mit einen Methodennamen verwendet. Ein Objekt kann also z.B. so aussehen. "Net::FTP=HASH(0x123456)"
Ein Objekt enthält also noch zusätzlich ein "Net::FTP=" am Anfang. Jedenfalls wenn es ein Objekt von Net::FTP wäre.
Sagen wir "$ftp" wäre ein Objekt und du gibst nun folgendes ein: "$ftp->login()". Letztendlich passiert nichts anderes als das geschaut wird mit welchen Package Namen $ftp verbunden ist. Und dieser Package Name wird dann letztendlich benutz.
Wenn $ftp ein Net::FTP Objekt ist, wird die Variable durch diesen String ersetzt.
"Net::FTP::login()"
Allerdings ist das noch nicht alles. Den wenn letztendlich bei jedem Objekt die selbe Methode aufgerufen wird, dann könnte man ja keine Unterschiedlichen Objekte Realisieren, also wird als erster Parameter die eigene Referenz übergeben.
Aus
"$ftp->login()"
wird also letztendlich
"Net::FTP::login($ftp)"
Dieser Objektorientierte Ansatz ist letztendlich identisch mit den von C und GTK, wenn du ihn kennst. Dort gibt es letztendlich nur Funktionen, du hast ein struct das Unterschiedliche Werte enthält, und du übergibst einfach jeder Funktion als ersten Parameter ein struct. Die Funktion ist letztendlich Identisch, arbeitet aber immer mit anderen Werten.
Das gleiche bei Perl. Nur gibt es halt die Verkürzung mit dem Operator "->". (Und natürlich @ISA mit dem sich Vererbung realisieren lässt, und AUTOLOAD, UNIVERSAL und weitere kleinigkeiten. ;) )
Das was letztendlich ein bless macht ist lediglich eine Referenz zu erweitern. Und zusätzlich noch zu Speichern in welchem Package nach Methoden gesucht werden soll, wenn du Methoden mit dem "->" Operator aufrufst.
Du verknüpfst also eine Referenz mit einem Package Namen. Das wars eigentlich auch schon.
Im Konstruktor musst du letztendlich nur folgendes machen. Eine Referenz als Datenstruktur benutzen, das die Individuellen Daten Speichern kann die dein Objekt besitzen darf. Das kann ein Skalar, ein Array oder ein Hash sein. Eine Regex oder ein Dateihandle geht aber auch.
Und diese Referenz verbindest du dann mit einem Package. Das machst du mit bless.
Der Rückgabewert von bless selber ist dann die neue Referenz die mit einem package verbunden ist. Deswegen wird es auch oft als letzte Funktion im Konstruktor aufgerufen.
Das was du einfach Wissen musst ist noch was der "->" macht.
1) Alles was vor dem -> steht wird als ersten Paramter übergeben.
2) Steht dort eine Variable (Skalar) wird die Variable durch das package ersetzt mit dem es verbunden ist.
Net::FTP->new()
wird also zu:
Net::FTP::new( 'Net::FTP' );
Dieses verhalten wird dann halt bei Konstrukturen ausgenutzt, und der erste Wert wird dann üblicherweise in $class gespeichert, und $class wird dann halt als Klassenname benutzt.
----
Den Konstruktor kannst du nach belieben erzeugen. Du kannst im Konstruktor auch erstmal das Objekt erzeugen.
"my $self = bless \%hash, $class"
und danach Methoden auf dem Objekt ausführen. Und erst danach $self zurück geben.
Du kannst im Konstruktor aber auch Objekte von z.B. 3 anderen Klassen erzeugen, diese in einem hash Speichern, und dann diesen Hash als dein Klassenobjekt zurück geben etc.
----
Wenn du also Methoden schreibst dann machst du üblicherweise als erste Zeile ein "my $self = shift;" damit wird letztendlich der erste Wert in $self gespeichert. Bei Methoden sollte dies also eine Referenz auf ein Hash, Array etc. sein das die individuellen Daten etnhält.
Und mit diesen Daten kannst du dann ganz normal Arbeiten, und sie verändern, so als wäre es ein ganz normales Array, Hash.
----
Das Wort "Instanz" wird in "Einführung in Perl Objekte, Ref..." synonym für "Objekt" benutzt.\n\n
<!--EDIT|sid burn|1160178770-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de