Чтение онлайн

на главную - закладки

Жанры

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

Шохирев Михаил Васильевич

Шрифт:

sub new { # метод-конструктор объектов

my $class = shift; # 1-й параметр ссылка на имя класса

my $self = {}; # контейнер для атрибутов объекта

$self->{name} = ''; # начальные значения атрибутов

bless($self, $class); # "благословить" объект ссылки

return $self; # вернуть ссылку на созданный объект

}

Затем в описании

класса обычно определяются методы для доступа к атрибутам объекта. Для примера определим метод для доступа (accessor) к атрибуту 'name' ("имя") и метод для изменения его значения (modifier).

sub say_name { # метод доступа (accessor) к атрибуту name

my ($self) = @_; # получить ссылку на объект

return $self->{name}; # вернуть значение атрибута

}

sub give_name { # метод изменения (modifier) атрибута name

my $self = $_[0]; # 1-й аргумент: ссылка на объект

$self->{name} = $_[1]; # 2-й аргумент: новое значение

}

1; # истинное значение требуется для use

__END__ # конец описания класса

В классе описываются методы для работы с атрибутами объектов класса, причем часто один метод используется для чтения и для изменения значения атрибута. В примере опишем метод для чтения и записи (mutator) свойства 'height' ("рост"):

sub height { # метод чтения и записи атрибута height

my $self = shift; # извлечь ссылку на объект

$self->{height} = shift # присвоить новое значение,

if @_; # если передан аргумент

return $self->{height}; # вернуть значение атрибута

}

Обратите внимание, что описание класса значительно проще, чем описание традиционного модуля. Для работы с классом не требуется никаких списков экспортирования имен. Вместо этого описываются методы, которые можно рассматривать как сервисы, предоставляемые классом для взаимодействия с каждым из конкретных экземпляров класса. Набор методов для управления поведением объекта называют его интерфейсом. Для работы с объектами класса достаточно знать этот интерфейс, не вдаваясь в детали реализации поведения объектов.

В программе, в которой применяются объекты описанного класса, мы увидим вполне знакомую нотацию, когда подпрограммы вызываются при помощи ссылочных переменных и операции ->. В объектной терминологии это называется обращением к методам объектов (или отправка сообщения объекту). Приведем пример создания двух объектов одного класса, каждый из которых обладает собственными значениями свойств:

# способ обращения к методам через ссылки на объекты

use Person; # будем использовать этот класс

#
создать объект класса,

my $hobbit = Person->new; # вызвав его конструктор

# задать значение свойства, обратившись к методу объекта

$hobbit->give_name('Фродо Бэггинс');

# создать другой объект

my $dwarf = Person->new; # не обязательны

$dwarf->give_name('Гимли'); # задать значение свойства

# запросить значения свойств, обратившись к методам

print $hobbit->say_name, ' ', $dwarf->say_name, "\n";

Взаимодействие с объектом строится на обращении к его методам. Обращение к методу происходит при помощи ссылки на экземпляр конкретного объекта, и при этом первым аргументом в метод автоматически передается ссылка на этот объект. Например:

$hobbit->give_name('Бильбо Бэггинс'); # соответствует вызову:

Person::give_name($hobbit, 'Бильбо Бэггинс');

Внутри метода ссылка на экземпляр объекта используется для доступа к данным этого экземпляра и обращения к другим методам. Для обращения к конструктору используется имя класса, так как во время работы конструктора уже существует класс, а экземпляр объекта только должен быть создан конструктором.

Если к ссылке на объект класса Person применить функцию ref, то она вернет значение не 'HASH', как можно было бы предположить, а 'Person'! Это результат "благословения" объекта ссылки функцией bless.

print "Класс объекта: '", ref($hobbit), "'\n"; # 'Person'

Кроме нотации с оператором "стрелка" ->, традиционно используемой при работе со ссылками, для доступа к методам применяются синтаксические конструкции с использованием косвенных объектов. При использовании этого стиля имя метода стоит перед именем класса или ссылкой на объект, после которой идет список аргументов, иногда заключаемый в круглые скобки. Использование косвенных объектов может сделать текст программы более наглядным и понятным. Приведем пример обращения к объектам в новом стиле:

# способ обращения к методам через косвенные объекты

use Person; # используем класс Person

my $magician = new Person; # "этот маг - новая личность"

give_name $magician 'Гэндальф'; # "назовем мага 'Гэндальф'"

my $name = say_name $magician; # "назови себя, маг"

print $name, "\n";

В качестве иллюстрации к сказанному на рис. 14.1 изображены языковые конструкции, применяемые при работе с объектами, и их взаимосвязи.

Поделиться:
Популярные книги

Газлайтер. Том 40

Володин Григорий Григорьевич
40. История Телепата
Фантастика:
альтернативная история
аниме
попаданцы
6.00
рейтинг книги
Газлайтер. Том 40

Миры Филипа Фармера. Том 4. Больше чем огонь. Мир одного дня

Фармер Филип Хосе
Фантастика:
научная фантастика
5.00
рейтинг книги
Миры Филипа Фармера. Том 4. Больше чем огонь. Мир одного дня

Диета долгожителя. Питаемся правильно. Специальные меню на каждый день. Советы и секреты для долгой и здоровой жизни

Шевченко Виталий Пименович
Дом и Семья:
здоровье и красота
кулинария
5.00
рейтинг книги
Диета долгожителя. Питаемся правильно. Специальные меню на каждый день. Советы и секреты для долгой и здоровой жизни

Продолжение «Тысячи и одной ночи»

Казот Жак
1. Литературные памятники
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Продолжение «Тысячи и одной ночи»

Воронцов. Перезагрузка

Тарасов Ник
1. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фантастика: прочее
5.50
рейтинг книги
Воронцов. Перезагрузка

Охотник за головами

Вайс Александр
1. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Охотник за головами

Месть

Камински Стюарт Мелвин
Детективы:
классические детективы
5.00
рейтинг книги
Месть

Замена Элит. Новые Люди Креативного Государства Прфессиональный Парламент. Книга 2

Мамыченко Андрей Валентинович
Научно-образовательная:
политика
5.00
рейтинг книги
Замена Элит. Новые Люди Креативного Государства Прфессиональный Парламент. Книга 2

#Бояръ-Аниме. Газлайтер. Том 11

Володин Григорий Григорьевич
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11

Семья попаданцев. Дилогия

Борискин Александр Алексеевич
Фантастика:
фэнтези
альтернативная история
6.61
рейтинг книги
Семья попаданцев. Дилогия

Перерождённые

Крапицкая Влада
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Перерождённые

Дисциплина и Портянки

Yirtimd2
1. Академия Бикон
Фантастика:
боевая фантастика
юмористическое фэнтези
сказочная фантастика
фэнтези
5.00
рейтинг книги
Дисциплина и Портянки

Предел Искушения

Цветков Цветков Владимирович
Фантастика:
научная фантастика
5.00
рейтинг книги
Предел Искушения

Том 11. Былое и думы. Часть 6-8

Герцен Александр Иванович
11. Собрание сочинений в тридцати томах
Проза:
русская классическая проза
5.00
рейтинг книги
Том 11. Былое и думы. Часть 6-8