VererbungPerl

SeitenanfangSeitenendeEinleitung

Als Programmierer ist man danach bestrebt, bereits vorhandenen Code wieder zu verwenden. Vererbung ist eine Möglichkeit dazu: Eine Klasse erbt die Methoden und Eigenschaften einer (oder mehreren - das ist in Perl der Fall) anderen Klasse. Die Klasse, von der man erbt nennt man Basisklasse und die Klasse, die erbt, nennt man abgeleitete Klasse. Es wird also bereits vorhandener Code verwendet. So könnte zum Beispiel eine Klasse Fortbewegungsmittel heißen. In dieser gibt es die Methode Geschwindigkeit, etc. Will man nun eine neue Klasse Auto programmieren, dann kann man diese von Fortbewegungsmittel ableiten und die vorhandenen Methoden (z. B. Geschwindigkeit) wieder verwenden. Auch eine Klasse Fahrrad kann von Fortbewegungsmittel abgeleitet werden.

Die Sache mit der Vererbung hängt aber immer davon ab, was man programmieren will - also auch vom Problem.

SeitenanfangSeitenendeVererbung in Perl, @ISA

Vererbung in Perl ist nichts weiter als das Angeben, von Klassen (das sind die Basisklassen) in denen Perl nach der zu erbenden Methode sucht. Ist die Methode nicht in der aktuellen Klasse (das ist die abgeleitete Klasse) vorhanden, wird in den angebenen Basisklassen gesucht, bis die gesuchte Methode gefunden worden ist.

Eigenschaften werden nicht vererbt. Das umgeht man durch guten Programmierstil, indem man geeignete Konstruktoren schreibt und diese in der bzw. den Superklasse(n) aufruft.

Wie bereits erwähnt ist Vererbung nichts anderes als das Angeben der Klassen, von denen geerbt werden soll. Das macht man über das Array @ISA - was von "is a" kommt: ("Auto is a Fortbewegungsmittel").

Ein Beispiel: Die Klasse Auto erbt von Fortbewegungsmittel:

# Fortbewegungsmittel.pm
package Fortbewegungsmittel;

sub new () {
  my $self=shift;
  my $newInst={};
  bless($newInst, $self);
  $newInst->setzeGeschwindigkeit(0);
}

sub setzeGeschwindigkeit(){
  my $self = shift;
  $self->{Geschwindigkeit} = shift;
}

sub Geschwindigkeit(){
  my $self = shift;
  $self->{Geschwindigkeit};
}

1;
# Auto.pm
use Fortbewegungsmittel;
package Auto;

@ISA = qw( Fortbewegungsmittel );


sub new () {
  my $self=shift;
  my $newInst={};
  bless($newInst, $self);
}

sub setzeVerbrauch() {
  my $self=shift;
  $self->{Verbrauch}=shift;
}

sub Verbrauch() {
  my $self=shift;
  $self->{Verbrauch};
}

1;
# bmw.pl
use Auto;

use Auto;

my $bmw = Auto->new();
$bmw->setzeVerbrauch(10);
$bmw->setzeGeschwindigkeit(220);

print "Verbrauch: ".$bmw->Verbrauch()."\n";
print "Geschwindigkeit: ".$bmw->Geschwindigkeit()."\n";
Verbrauch: 10
Geschwindigkeit: 220

SeitenanfangSeitenendeÜberschreiben von Methoden

Es kommt oft der Fall vor, dass in der Basisklasse und in der abgeleiteten Klasse dieselbe Funktion implementiert ist. Das nent man Überschreiben von der betroffenen Methode in der Basisklasse. Das Mittel des Überschreibens ist im Normalfall gewollt! Dazu folgendes Beispiel:

# Fortbewegungsmittel.pm
package Fortbewegungsmittel;

...

sub out() {
  my $self = shift;
  "Geschwindigkeit: ".$self->Geschwindigkeit()."\n";
}

1;
# Auto.pm
package Auto;

...

sub out() {
  my $self = shift;
  "Geschwindigkeit: ".$self->Geschwindigkeit()."\n".
  "Verbrauch: ".$self->Verbrauch()."\n";
}

1;

Dazu folgender Code:

# bmw.pl
use Auto;

my $bmw = Auto->new();
$bmw->setzeVerbrauch(10);
$bmw->setzeGeschwindigkeit(220);

print $bmw->out();
Geschwindigkeit: 220
Verbrauch: 10

SeitenanfangSeitenendeSUPER

Der Mangel der obigen Vorgehensweise: Die Ausgabe der Geschwindigkeit wurde doppelt programmiert. Diesen kann man beseitigen, indem man mit dem Schlüsselwort SUPER:: auf die Basisklasse zugreift:

# Auto.pm
package Auto;

...

sub out() {
  my $self = shift;
  $self->SUPER::out()."Verbrauch: ".$self->Verbrauch()."\n";
}

1;
# bmw.pl
use Auto;

my $bmw = Auto->new();
$bmw->setzeVerbrauch(10);
$bmw->setzeGeschwindigkeit(220);

print $bmw->out();
Geschwindigkeit: 220
Verbrauch: 10
Achtung: Was unter Umständen zu Schwierigkeiten führen kann ist die Mehrfachvererbung. Erbt eine Klasse von z. B. zwei Basisklassen dieselbe Methode und wird diese Methode in der abgeleiteten Klasse nicht überschrieben, herrscht hier eine "Uneiendeutigkeit", welche Methode benutzt werden soll. Perl reagiert so: Wer zuerst kommt malt zuerst. Das bedeutet: Die Methode der Klasse, die zuerst in @ISA steht wird bevorzugt behandelt.

Seitenanfang FehlermeldungHilfe zur Fehlermeldung © 2001-2003 Email an den AutorPerl, Lehrstuhl Mathe II, Uni Bayreuth