В качестве первого комментария к вопросу, о котором вы говорите, вам нужен полиморфизм. Пусть автомобиль решает, как должен вести себя автомобиль, а не заставляет парковку отслеживать поведение каждого типа автомобиля. например, вместо этого:
package Car;
package Ferrari;
use base 'Car';
package Chevrolet;
use base 'Car';
package ParkingLot;
sub add_car {
if (ref $car = 'Ferrari') {
$self->park_ferrari;
} elsif (ref $car = 'Chevrolet') {
$self->park_chevrolet;
} else {
die "Unknown car model!";
}
}
сделать это:
package Car;
sub park {
# park a generic Car
}
package Ferrari;
use base 'Car';
sub park {
# take the Ferrari for a spin before parking it
$self->drive_fast;
$self->SUPER::park;
}
package Chevrolet;
use base 'Car';
# No sub park defined, so it just parks like a generic Car
package ParkingLot;
sub add_car {
$car->park;
}
Теперь ParkingLot просто нужно знать, что у него есть Автомобиль, и Автомобиль знает, как он должен park
, так что вы можете добавить столько новых подклассов Автомобилей, сколько захотите, без необходимости изменять ParkingLot.
(Обратите внимание, что приведенный выше Perl-подобный псевдокод, а не реальный, исполняемый код Perl. Многие детали были намеренно опущены.)