Thread Erst Schritte OOP (10 answers)
Opened by styx-cc at 2007-12-01 19:00

styx-cc
 2007-12-01 19:00
#103356 #103356
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Halli hallo,
da ich gerade mal ne Woche schulfrei habe, wollte ich mich was Perl angeht etwas weiterbilden und die OOP (mit der ich bis auf ein wenig Java noch nie was zu tun hatte) erlernen. Dazu habe ich mir das Buch "Perl-Objekte, Referenzen & Module" unters Kopfkissen gepackt und versuche nun die Uebung aus Kapitel 9 zu meistern.
Erstmal der Source von der ersten Uebung, auf die die zweite aufsetzt:
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
#!/usr/bin/perl -w
use strict;

{package Animal;
  sub named {
    my $class = shift;
    my $name = shift;
    bless \$name, $class;
  }

  sub name {
    my $self = shift;
    #is self an object or a class
    ref $self ? $$self : "unnamed $self";
  }

  sub speak {
    my $self = shift;
    print $self->name ." goes ". $self->sound() .".\n";
  }
}

{package Horse;
  use base qw/Animal/;
  sub sound {'neiggghhhh'};
}

{package Mouse;
  use base qw/Animal/;
  sub sound {'Meep'};
  #overwrite speak
  sub speak {
    my $class = shift;
    $class->SUPER::speak(@_);
    print "[But you can barely hear it]\n";
  }
}

print "Choose between the following animals,\nseperate them by space:\n";
my %animals = (Horse => 0, Mouse => 0);
print join(" ", sort keys %animals) ."\n\n";
chomp(my $user_animals = <STDIN>);

my @user_animals = split/ /, $user_animals;
for (@user_animals) {
  $_ = ucfirst($_);
   if(exists($animals{$_})) {$animals{$_}++};
}

while ( my ($key, $value) = each(%animals) ) {
  my $tmp = $key->named('Test');
  $tmp->speak for(1..$value);
}


Das funktioniert auch alles ganz toll, es geht nur darum Tiere mit verschiedenen Namen und Ausgaben zu erzeugen, aber zwei Punkte der Uebungsaufgabe bekomme ich alleine nicht hin.
Die Aufgabe lautet (auf den oben gelisteten Source bezogen):
[ul]
[li]Auf der Ebene wie "Animal" eine Klasse "Person" hinzufuegen[/li]
[li]Beide Klassen v. neuer Klasse "LivingCreature" erben lassen[/li]
[li]Erweitern der Methode speak, so dass ein Parameter uebergeben werden kann, indem festgelegt wird was gesagt wird - Tiere duerfen keine Parameter entgegen nehmen[/li]
[li]Benutzungsfehler wie z.B. eine vergessene Definition v. sound abfangen[/li]
[/ul]

Also hab ich mich ebend hingesetzt und das produziert:
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
#!/usr/bin/perl -w
use strict;

{package LivingCreature;
  sub named {
    my $class = shift;
    my $name = shift;
    bless \$name, $class;
  }

  sub name {
    my $self = shift;
    #is self an object or a class
    ref $self ? $$self : "unnamed $self";
  }

  sub speak {
    my $self = shift;
    my $sound = shift;
    if($self eq '') {
    
    }
    print $self->name ." goes ". $self->sound($sound) .".\n";
  }
}

{package Person;
  use base qw/LivingCreature/;
  sub sound {
    my $self = shift;
    my $sound = shift;
    $sound ? $sound : 'Hmmm';
  }
}

{package Animal;
  use base qw/LivingCreature/;
}

{package Horse;
  use base qw/Animal/;
  sub sound {'neiggghhhh'};
}

{package Mouse;
  use base qw/Animal/;
  sub sound {'Meep'};
  #overwrite speak
  sub speak {
    my $class = shift;
    $class->SUPER::speak(@_);
    print "[But you can barely hear it]\n";
  }
}

my $p1 = Person->named('Edgar');
my $h1 = Horse->named('Mr. Ed');
my $p2 = 'Person';

$h1->speak;
$p1->speak;
$p1->speak('Hello World :D');
$p2->speak;
$p2->name;


So, nun habe ich drei Fragen:
1.
Code (perl): (dl )
1
2
3
20:     if($self eq '') {
21:     
22:     }

wie kann ich da abfragen, ob ein Animal oder eine Person spricht bzw. ist das ueberhaupt die richtige Stelle um das zu pruefen?

2. Wie kann ich die Benutzungsfehler abfangen, wenn man in einer Unterklasse z.B. vergisst sound zu definieren (ein Tipp reicht mir, dann hab ich wenigstens noch was zu tun)?

3. Wenn einem Animal ein Parameter fuer die Methode speak (Animal::speak(@args)) bekommt habe ich mir gedacht zu warnen und das Programm zu beenden. Wie warne ich am besten?
Ich seh immer wieder dieses croak, kann mir jemand erklaeren was es damit auf sich hat? Das frage ich mich schon ewigkeiten.
Oder einfach mit einem die()?
Oder ein print und exit?

Und wenn jemand große Langeweile hat, kann er mir ja auch noch sagen was fuer Schoenheitsreperaturen noetig sind damit das vernueftig aussieht, wuerde mich freuen.

Vielen Dank fuer die Muehe sich das durchgelesen zu haben ;-)

MfG
Pörl.

View full thread Erst Schritte OOP