Thread Liskovsches Sommerloch
(19 answers)
Opened by rosti at 2025-06-25 09:13
Und noch eine Regel: Übergebe keine Objekte dem Konstruktor einer anderen Klasse. Untenstehendes Beispiel zeigt ein mögliches Problem.
Wir haben eine Klasse Tank und erstellen ein Objekt $tank. Dann haben wir eine Klasse PKW und zum Erstellen einer Instanz $pkw übergeben wird das Tankobjekt. Also in der main sowas: Code (perl): (dl
)
1 2 my $tank = Tank->new( fuel => 100 ); # volltanken my $pkw = PKW->new( tank => $tank ); # ein Auto bauen Das Problem was da auftreten kann ist, daß das Objekt $tank in der main geändert werden kann und damit auch die Eigenschaft des Objekts $pkw. Denn wenn man jetzt mit demselben $tank-Objekt einen Zweitwagen baut und diesen Zweitwagen leerfährt, kann auch $pkw nicht mehr fahren. Denn das Leerfahren heißt ja nichts weiter als daß $tank->fuel(0); aufgerufen wird. Besser also machen wir das so: Code (perl): (dl
)
my $pkw = PKW->new( tank => Tank->new(fuel => 100) ); Und stellen damit sicher daß das Tank-Objekt unteilbar+unveränderbar in nur einem neuen PKW verbaut wird. Code zum Autofahren: 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 package Tank{ use strict; use warnings; # Tank bauen sub new{ my $class = shift; my %cfg = ( fuel => 0, @_); return bless \%cfg, $class; } # Tankinhal ändern sub fuel{ my $self = shift; my $fuel = shift; unless( defined $fuel ){ return $self->{fuel} } else{ $self->{fuel} = $fuel } } }; package PKW{ use strict; use warnings; # Auto bauen sub new{ my $class = shift; my %cfg = (tank => {}, @_); bless \%cfg, $class; } # Tankinhalt ändern, delegierte Methode sub fuel{ my $self = shift; return $self->{tank}->fuel(@_); } }; 1; ########################################################## package main; use strict; use warnings; my $tank = Tank->new( fuel => 100 ); my $pkw = PKW->new( tank => $tank ); my $zweitwagen = PKW->new( tank => $tank ); $zweitwagen->fuel(0); # Leerfahren print $pkw->fuel; # Tank leer Und nein, PKW erbt nicht von Tank ;) . Last edited: 2025-06-29 20:14:55 +0200 (CEST) |