Язык программирования Perl

Наследование


Наследование - это мощный механизм конструирования нового класса, позволяющий уточнить существующий класс, изменить его поведение родительского класса или добавить к нему новые свойства. В Perl это делается легко и просто: нужно упомянуть имя родительского класса в специальном массиве @ISA текущего класса. Исполняющая система, не найдя вызванного метода в текущем модуле, продолжает его поиск в пакетах, перечисленных в массиве @ISA. Приведем пример описания класса Wizard, производного от класса Person:

package Wizard; # класс "Маг" our @ISA = qw(Person); # является подклассом Person use Person; # и использует пакет Person # ... описание методов класса Wizard... 1; # вернуть истину для use

Смысл наследования - в создании подклассов, изменяющих поведение базового класса. Для этого в дочерних классах описываются новые методы или переопределяются существующие. В качестве примера опишем для класса Wizard новый метод для работы со свойством 'magic' ("тип магии" - белая или черная):

sub magic { # магия - вот что отличает волшебника my $self = shift; # извлечь ссылку на объект $self->{magic} = shift if @_; # изменить значение return $self->{magic}; # вернуть значение }

Кроме того, переопределим конструктор объектов класса new() так, чтобы он принимал два аргумента для инициализации свойств 'name' и 'magic'. Для создания объекта воспользуемся конструктором родительского класса, затем зададим начальные значения свойств, и, наконец, "дадим благословение" объекту ссылки быть магом:

sub new { # конструктор объектов my $class = $_[0]; # имя класса в 1-м аргументе my $self = new Person; # маг - это личность $self->{name} = $_[1]; # задать имя из 2-го аргумента $self->{magic} = $_[2]; # и тип магии из 3-го bless($self, $class); # "благословить" мага return $self; # вернуть ссылку на объект }

Вызывающая программа, использующая производный класс, будет выглядеть следующим образом:

use Wizard; # подключить производный класс

# создать нового черного мага - Сарумана my $wizard = new Wizard('Саруман', 'black'); my $name = say_name $wizard; # "назови себя, маг" print $name, ' ', $wizard->magic(); # 'Саруман black' print ref($wizard); # тип объекта ссылки - 'Wizard'

Естественно, что у объекта класса Wizard можно вызывать не только методы собственного класса, но и любые методы, унаследованные из родительского класса Person.



Содержание раздела