Thread Can't locate object method
(6 answers)
Opened by hugenyn at 2011-06-25 22:06
So würde ich es Anfangen
ich benutze zusätzlich zwei weitere Module - Scalar::Util aus dem ich blessed nutze um festzustellen ob es sich um ein Objekt handelt und - base welches den Elternnamen nicht nur in @ISA einfügt sondern auch das Paket lädt, wenn nötig. Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 #!/usr/bin/perl use strict; use 5.010; use warnings; # Die Elternklasse # ~~~~~~~~~~~~~~~~~~~~~~~~~~ package Tier; use Scalar::Util qw(blessed); # blessed prüft, # ob es sich um ein Objekt handelt # und nicht nur um eine Refenz. # wie spricht das Tier? sub sprich { my $self = shift; # 'can' prüft ob ein Objekt/Klasse eine Methode hat # das ist nötig, falls einer auf die Idee kommen sollte # 'Tier' direkt zu nutzen if($self->can('ton')) { print $self->name()." macht ".$self->ton().".\n"; } else { print $self->name()." ist tonlos!\n"; } } # welche Farbe hat das Tier? sub farbe { my $self = shift; my $farbe=undef; $farbe=$self->{farbe} if (blessed($self) && $self->{farbe}); $farbe=$self->standardfarbe() if(!$farbe && $self->can('standardfarbe')); if($farbe) { print $self->name()." ist $farbe.\n"; } else { print $self->name()." hat keine Farbe!\n"; } } # Farbe des Tieres ändern sub set_farbe { my $self = shift; $self->{farbe} = shift; } # wie heisst das Tier? # gibt Objekt- oder Klassennahme an sub name { my $self = shift; return $self->{name} if(blessed($self) && $self->{name}); # Klassennamen ermitteln wenn nötig $self=blessed($self) if(blessed($self)); return "$self ohne Namen"; } # neues Tierobjekt anlegen sub new { my $class = shift; $class=blessed($class) if(blessed($class)); my $self = {}; $self->{name} = shift; $self->{farbe} = undef; bless( $self, $class ); } # eine abgeleiteten Klasse #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ package Ente; use base 'Tier'; # Angabe der Elternklasse. # 'use base ...' lädt die angebenen Klassen automatisch wenn nötig sub ton { return "quack"; } sub standardfarbe { return "braun gesprenkelt"; } ####################################################### ####################################################### package main; # Eltern Klasse testen: Tier->sprich; # Ausgabe: Tier ohne Namen ist tonlos. Tier->farbe; # Ausgabe: Tier ohne Namen hat keine Farbe. print "#"x30,"\n"; # ein Objekt Tier my $etwas=Tier->new('wolpertinger'); $etwas->sprich; # ein Objekt Tier my $nichts=Tier->new(); $nichts->sprich; print "#"x30,"\n"; # Klassenmethode testen Ente->sprich; # Ausgabe: Ente ohne Namen macht quack. Ente->farbe; # Ausgabe: Ente ist braun gesprenkelt. print "#"x30,"\n"; # ein Objekt Ente my $duck = Ente->new("Donald"); $duck->sprich; # ein Objekt Ente my $ente = Ente->new(); $ente->sprich; |