"Jens Puruckherr" jpuruckherr@cyberport.de writes:
Steffen Schwigon schwigon@webit.de schrieb:
108 my $std_rechnungadr = $kunde->getStdRechnungsadr(); 109 bless $std_rechnungadr,"Adresse";
Die Funktion getStdRechnungsadr() sollte bereits ein Objekt der Klasse "Adresse" liefern, also intern z.B. ein
$a = Adresse->new(); # ... return $a;
ausführen.
Das macht sie ja auch, allerdings wird kein neues erzeugt, sondern ein bereits vorhandenes zurückgegeben.
Auch ok. Also ist Dein bless oben trotzdem überflüssig, aus immernoch dem gleichen Grund.
Im XMLHelper sind die Klassen Kunde und Adresse zwar mit 'use' eingebunden, aber weiss er wirklich, was er in dem Moment erhält?
Wenn ein Objekt verwendet wird (was ja prinzipiell erstmal nur ein beliebiges Skalar, meist eine Hashreferenz ist), dann ist genau wegen des "bless" an diesem Objekt die Info über die Klasse drin.
Prinzipiell muß aber die entgegennehmende Stelle nicht wissen, es ist. Es schlägt erst etwas fehl, wenn du auf so einer Referenz z.B. eine Methode aufrufst, die es nicht gibt.
Möglicherweise betrachtest Du das "bless" so ähnlich wie ein Typecast in anderen Sprachen. Nur eine Vermutung von mir. Das wäre jedenfalls nicht korrekt.
Etwas weiter oben mache ich folgendes:
foreach my $kunde (@kundenliste){ bless $kunde,"Kunde"; $logger->debug( "bei Kunde: ". $kunde->getKundennummer() ); ....
Was ohne das bless nicht funktioniert.
Wenn in @kundenliste bereits geblesste Objektreferenzen drin sind, sollte es gehen. Ausnahmen entstehen, wenn die Kundenliste zwischendurch mal in einer Datei o.ä. war, dann müssen die Referenzen nach dem Einlesen wieder geblesst werden. Möglicherweise machst Du irgendetwas vergleichbares.
In der eigentlichen Applikation solltest Du kein bless brauchen, das sollte auf niederer Ebene, konkret im Konstruktor verborgen sein.
Der XMLHelper gehört nicht zur Applikation, sondern ist eine Klasse wie Kunde oder Adresse.
Das ist auch gut so. Ich meine mit dem Begriff Applikation praktisch alles, was nicht zur Implementierung des OO-Mechanismus gehört, also auch alle Funktionen im XMLHelper, die nicht Konstruktor sind. bless bildet dazu die andere Seite und dient praktisch nur dazu, OO möglich zu machen, deswegen taucht das im Konstruktor auf.
Ich wollte nur nicht den ganzen XML-Krims mit zum Kunden packen, wo er auch nicht hingehört.
Korrekt.
Meine App. erstellt ein Array von KundenObjekten @kundenliste, die dann dem XMLHelper zum tranformieren gegeben wird. Jedes Kundenobjekt enthält wiederum ein paar Adressobjekte. Aber ich glaube, ich habe den Fehler gerade gefunden:
In $kunde wird eine Refernz auf das AdressObjekt gespeichert, nicht das Objekt selber.....
Eine Objekt *ist* eine Referenz. Meist eine ganz normale Hastablereferenz. Nur eben geblesst, damit man z.B. die dazugehörigen Memberfunktionen aufrufen kann. Das bless ist nur dazu da, damit der unterliegende OO-Mechanismus die zugehörige Klasse findet.
Und Referenzen zu speichern ist fast immer korrekt. Kann natürlich sein, daß Du eine Referenz auf die Objektreferenz meinst, das könnte z.B. ein Fehler sein. Oder bei der Argumentübergabe klappt was nicht.
Zusammenfassung: Versuche, bless nur noch in den Konstruktoren zu verwenden und strukturier den Code entsprechend um. Dann kannst Du besser den möglichen Restfehler finden.
Das OO-Tutorial via "man perltoot" ist IMHO ganz brauchbar für diese Sachen.
Habe ich mir schon reingezogen , half mir nicht wirklich weiter ...
Try again. :-) Echt.
GreetinX Steffen