Опубликован: 17.08.2006 | Доступ: свободный | Студентов: 5372 / 697 | Оценка: 4.49 / 3.94 | Длительность: 20:58:00
ISBN: 978-5-9556-0078-9
Лекция 14:

Объектное программирование

Методы и атрибуты класса

В классе могут быть определены методы, не предназначенные для работы с конкретными объектами. Такие методы называются методами класса или статическими методами. Для обращения к ним, так же как для обращения к конструктору, используется имя класса, а не ссылка на объект. Часто эти методы обслуживают данные, общие для всех объектов класса (то есть объявленные глобально на уровне класса). Подобные данные называются атрибутами класса. В качестве примера опишем класс Magic::Ring, где метод класса count() будет использоваться для доступа к значению атрибута класса $Magic::Ring::count, в котором будет храниться количество созданных волшебных колец.

package Magic::Ring;         # класс "Магическое Кольцо"
sub new {                    # конструктор
   my ($class, $owner) = @_; # имя класса и значение атрибута
   $Magic::Ring::count++;    # сосчитать новое Кольцо
   bless({owner => $owner}, $class); # "благословить" хэш
}

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

$Magic::Ring::count = 0;      # атрибут класса: число Колец 
sub count {                   # метод класса 
   return $Magic::Ring::count;
}
1; # конец описания класса Magic::Ring

В программе, использующей класс Magic::Ring, создается набор объектов. При каждом обращении к конструктору увеличивается счетчик созданных магических колец $Magic::Ring::count.

package main;
use Magic::Ring; # использовать класс "Магическое Кольцо"

my @rings = ();
for (1..3) { # "Три кольца - премудрым эльфам..."
   push @rings, new Magic::Ring('эльф');
}
for (1..7) { # "Семь колец - пещерным гномам..."
   push @rings, new Magic::Ring('гном');
}
for (1..9) { # "Девять - людям Средиземья..."
   push @rings, new Magic::Ring('человек');
}
# "А Одно - всесильное - Властелину Мордора..."
push @rings, new Magic::Ring('Саурон');
# Сколько всего было сделано колец?
print Magic::Ring->count, "\n"; # будет выведено: 20

Модуль Class::Struct

В стандартную библиотеку модулей Perl входит модуль Class::Struct, который облегчает жизнь программистам по описанию классов, предоставляя для объявления класса функцию struct(). Эта функция генерирует описание класса в указанном пакете, включая методы для доступа к атрибутам класса. Причем помимо имени атрибута она позволяет задавать его тип с помощью разыменовывающего префикса: скаляр ($), массив (@), хэш (%), ссылка на подпрограмму (&) или объект. Насколько просто и удобно пользоваться функцией struct, можно судить по такому примеру:

use Class::Struct;    # подключаем стандартный модуль

# описываем класс Performer ("Исполнитель")
struct Performer => { # атрибуты класса:
   name    => '$',    # "имя" - скаляр
   country => '$',    # "страна" - скаляр
   artists => '%',    # "артисты" - хэш
};                     
my $performer = new Performer;  # создаем исполнителя
$performer->name('Pink Floyd'); # задаем значения атрибутов
$performer->country('Great Britain');
# заполняем атрибут-хэш:
$performer->artists('David Gilmour', 'гитары, вокал');
$performer->artists('Roger Waters', 'бас-гитара, вокал');
$performer->artists('Nick Mason', 'ударные');
$performer->artists('Richard Wright', 'клавишные');

# описываем класс Album ("Альбом")
struct Album => {            # атрибуты класса:
   title  => '$',            # "название" - скаляр
   year   => '$',            # "год выхода" - скаляр
   tracks => '@',            # "композиции" - массив
   performer => 'Performer', # "исполнитель" - объект
};
my $album = Album->new;      # создаем альбом
$album->title('Dark Side of the Moon');
$album->year(1973);
# заполняем атрибут-массив:
$album->tracks(0, 'Breathe');
$album->tracks(1, 'Time');
# и так далее... 
$album->performer($performer); # задаем атрибут-объект

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

package Album;      # переключаемся на нужный пакет
sub Album::print {  # и описываем дополнительный метод
   my $self = shift;
   printf("%s '%s' (%d)\n", 
      $self->performer->name, $self->title, $self->year);
   foreach my $artist (keys%{$self->performer->artists}) {
      printf("\t%s - %s\n", 
         $artist, $self->performer->artists($artist));
   }
}
package main;       # переключаемся на основную программу
$album->print;      # и вызываем метод объекта
Сергей Крупко
Сергей Крупко

Добрый день.

Я сейчас прохожу курс  повышения квалификации  - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?

 

Галина Башкирова
Галина Башкирова

Здравствуйте, недавно закончила курс по проф веб программиованию, мне прислали методические указания с примерами тем, однако темы там для специальности 

Системный администратор информационно-коммуникационных» систем.
Мне нужно самой найти тему? или делать по высланным темам