Добрый день. Я сейчас прохожу курс повышения квалификации - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?
|
Объектное программирование
Работа с объектами
В программе, в которой применяются объекты описанного класса, мы увидим вполне знакомую нотацию, когда подпрограммы вызываются при помощи ссылочных переменных и операции ->. В объектной терминологии это называется обращением к методам объектов (или отправка сообщения объекту). Приведем пример создания двух объектов одного класса, каждый из которых обладает собственными значениями свойств:
# способ обращения к методам через ссылки на объекты 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 изображены языковые конструкции, применяемые при работе с объектами, и их взаимосвязи.
Наследование
Наследование - это мощный механизм конструирования нового класса, позволяющий уточнить существующий класс, изменить его поведение родительского класса или добавить к нему новые свойства. В 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.