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
#!/usr/bin/perl
use strict;
use 5.010;
use warnings;
# Die Elternklasse
# ~~~~~~~~~~~~~~~~~~~~~~~~~~
package Tier; # Plate, Seite 401
# wie spricht das Tier?
sub sprich {
my $klasse = shift;
print $klasse->name, " macht ", $klasse->ton, ".\n";
}
# welche Farbe hat das Tier?
sub farbe {
my $klasse = shift;
if (ref $klasse) {
print $klasse->name, " ist ", $klasse->{farbe}, ".\n";
} else {
print $klasse, " ist ", $klasse->standardfarbe, ".\n";
}
}
# Farbe des Tieres ändern
sub set_farbe {
my $klasse = shift;
$klasse->{farbe} = shift;
}
# wie heisst das Tier?
# gibt Objekt- oder Klassennahme an
sub name {
my $self = shift;
ref $self ? $self->{name} : "$self ohne Namen";
}
# neues Tierobjekt anlegen
sub new {
my $klasse = shift;
my $self = {};
$self->{name} = shift;
$self->{farbe} = $klasse->standardfarbe();
bless {$self, $klasse};
}
# eine abgeleiteten Klasse
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package Ente;
our @ISA = qw(Tier); # Angabe der Elternklasse
sub ton { "quack" };
sub standardfarbe { "braun gesprenkelt" };
package main;
# Klassenmethode testen
Ente->sprich; # Ausgabe: Ente ohne Namen macht quack.
Ente->farbe; # Ausgabe: Ente ist braun gesprenkelt.
# ein Objekt Ente
my $duck = Ente->new("Donald");
$duck->sprich; # Ausgabe: Can't locate object method "ton"
# via package "Tier" at ./fun/ooTiere1 line 15.
2011-06-25T20:06:14 hugenynCode: (dl )bless {$self, $klasse};
bless $self, $klasse;
bless {$self, $klasse};
QuoteÜbrigens benutzt du auch $klasse in Methoden, in denen es keine Klasse, sondern ein Objekt enthält, das finde ich ziemlich verwirrend.
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;
QuoteWird wohl doch Zeit für eine neue Brille zum Abschreiben von Lehrstücken!
2011-06-25T21:39:53 hugenynQuoteÜbrigens benutzt du auch $klasse in Methoden, in denen es keine Klasse, sondern ein Objekt enthält, das finde ich ziemlich verwirrend.
Kannst Du das mal an meinem Code zeigen?
Ich habe den Code aus einem Buch verwendet, um das Prinzip OOP zu verstehen.