Schrift
[thread]12226[/thread]

Anfänger OO-Frage

Tags: Ähnliche Threads

Leser: 1


<< |< 1 2 >| >> 18 Einträge, 2 Seiten
Gast Gast
 2008-07-23 14:13
#112484 #112484
Hallo Zusammen

Habe mich jetzt das erste mal mit PERL beschäftigt und bin etwas verwirrt. Wenn ich folgendes Program laufen lasse, kommt immer die Meldung
Code: (dl )
Can't locate object method "id" via package "http_link" at test.pl line 41.


Hier mein Programm:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
while (my $ref = $sth->fetchrow_hashref()) {
                push(@collection, http_link->new($ref->{'products_id'}, $ref->{'LiferantenLink'} ));
        }       
        
        print $collection[3]->getid;    

package http_link;
        my ($id, $link);
        sub new { 
                my $Objekt = shift; 
                $id = shift;
                $link = shift;
                my $Referenz = {};       
                bless($Referenz,$Objekt);    
                return($Referenz);
        }
        sub getid{
                my $Objekt = shift;
                return ($Objekt->id);      #Hier kommt der Error
        }


Ich kenne OO zwar aus C++ und JAVA, aber hier scheine ich irgendwas falsch zu verstehen. Währe um jede Hilfe sehr dankbar.
betterworld
 2008-07-23 15:05
#112488 #112488
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Mit $Objekt->id wird die Methode "id" aufgerufen. Dein getid ist zum Beispiel eine solche Methode. Aber sie ruft dann wiederum die Methode "id" auf, die es aber nicht gibt. Du moechtest dort wahrscheinlich eine Instanzvariable auslesen. Das macht man normalerweise ueber Hash-Elemente, da muesstest Du dann $Objekt->{id} schreiben. Dieses Hash-Element musst du in new allerdings noch setzen, denn Deine Variable $id wird in new nicht weiter verwendet.

Ferner ist $Objekt in new eigentlich kein Objekt, sondern ein Klassenname.
Struppi
 2008-07-23 16:25
#112489 #112489
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Deine Variabel $id ist auch keine Objektvariabel sondern eine package Variabel, ich glaub sowas ähnliches wie eine statische in Java, d.h. sie ist in alle http_link Objekten gleich. Daher geht man in Perl den Umweg über ein geblesstes Hashobjekt, wie betterworld es beschrieben hat.

Ich vermute der Umstieg von Java oder auch C++ zu Perl OO ist etwas kompliziert, da das Konzept doch völlig anders ist und von Puristen auch nicht geschätzt wird.
Gast Gast
 2008-07-23 16:57
#112492 #112492
hm ok. Habt ihr auch zufellig grad eine anleitung wie ich das machen muss? oder wo ich eine Anleitung finden kann?
Wie gesagt, kenne PERL nicht wirklich
Gast Gast
 2008-07-23 17:00
#112493 #112493
Also sowas wie nen statische auch nicht !

static hieß das die für alle instanzen einer klassen gleich wäre sprich

our $id; kommt da am nächsten dran.

Das entspricht ner VARIABLEN die in einen namespace dekalariert wurde.

namespace package{
int id = 61;
}


cout << package::id <<endl;


mfg Dirk
Gast Gast
 2008-07-23 17:03
#112494 #112494
Code (perl): (dl )
1
2
3
4
5
   
 my $Referenz = bless {
      id => 61,
   }, $Objekt;
   return $self;


mfg Dirk
Gast Gast
 2008-07-23 17:05
#112495 #112495
Code (perl): (dl )
1
2
3
4
 my $Referenz = bless {
      id => 61,
   }, $Objekt;
   return Referenz;# $self wäre üblicher. von da her tippfehler.



mfg Dirk
Struppi
 2008-07-23 17:08
#112496 #112496
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Gast+2008-07-23 15:00:14--
Also sowas wie nen statische auch nicht !

static hieß das die für alle instanzen einer klassen gleich wäre sprich
Ist sie auch ohne our, mit our kannst du von aussen zugreifen, das ist etwas anderes.

Es ist also sowas wie eine statische lokale Variabel
Gast Gast
 2008-07-23 17:35
#112499 #112499
ok statisch ist in ordnung.
Dachte eben eher an so was.
public:
static id;
und da könntest Du ja übers objekt drauf zugreifen.
aber jetzt meinst Du eine static globale variable.
Also letzendlich entspricht es einer static globalen variable die in einen namespace deklariert wurde ?
Oder bin ich jetzt komplett verwirrt (perl ist schon ein wenig verpeilend)?

mfg Dirk







LanX-
 2008-07-23 18:31
#112502 #112502
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
so schwer ist es nicht, diese Java Terminologie verwirrt nur, in Perl ist OOP quasi auf Packages aufbebockt, indem blessing und $obj->methode() aufrufsyntax hinzugefügt wurde.

Our beschreibt eine Packagevariable, die ist auch von außen erreichbar solange man das package mit angibt.

My beschreibt eine lexikalische Variable, die ist nie von außen erreichbar udn gilt nur im scope {block}, und der kann maximal das aktuelle File sein (was meistens auch dein Package ist)

Das gilt unabhängig von OOP!


Objektattribute kannst du nur über $self realisieren, jede "Methode" bekommt die Referenz des aufrufenden Objektes als ersten Parameter, sonst wüßte die Routine ja nicht mit welcher Instanz sie arbeitet.

Ein Objekt ist in Perl nur eine in new() geblesste (gesegnete) Datenstruktur, meistens ein Hash, deswegen kannst du über $self->{attribut} auf die Instanzvariablen zugreifen (auch von außen mit $obj->{self} !)

Das ist ansich sehr elegant gelöst und du hast definitiv mehr Freiheiten als in Java, was du aber mit geschwätzigeren und unübersichtlicheren Code erkaufst.

Ruby löst das eleganter und es gibt zahlreiche Module die das in Perl vereinfachen, z.B. CPAN:Moose
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2008-07-23 14:13.