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

В разделе 5.1 мы говорили о том, что объектно-ориентированная парадигма программирования подразумевает создание активных программных единиц — объектов, которые состоят из процедур, описывающих, как объект должен отвечать на различные стимулы. При объектно-ориентированном подходе к решению задачи определяются необходимые объекты, которые затем описываются как самостоятельные единицы. В свою очередь объектно-ориентированные языки программирования предоставляют средства для выражения таких идей. В данном разделе мы познакомимся с некоторыми из этих средств и тем, как они представлены в трех наиболее известных объектно-ориентированных языках: C++, Java и С#.

Классы и объекты

Рассмотрим процесс разработки компьютерной игры, в которой игрок должен защитить Землю от падающих метеоритов, расстреливая их мощными лазерами. Каждый лазер имеет внутренний запас энергии, который расходуется при выстреле. Когда запас энергии исчерпан, лазер становится бесполезным. Каждый лазер должен уметь направлять луч на цель справа, слева и стрелять.

Согласно объектно-ориентированной парадигме каждый лазер в игре будет реализован как объект, содержащий информацию об оставшемся запасе энергии и процедуры для наведения луча на цель и выстрела. Поскольку свойства всех этих объектов (лазеров) одинаковы, их можно создавать по одному шаблону. В объектно-ориентированном программировании такой шаблон называется классом (class). В языках C++, Java и С# класс описывается с помощью следующего оператора:

class Имя_класса {

}:

где Имя_класса — это имя, по которому к классу обращаются в программе. В фигурных скобках описываются свойства класса.

Class LaserClass

{ int RemainingPower - 100; ~ Описание данных, которые

будут находиться в каждом

объекте данного типа

void turnRight ()

---------1--------- Методы, описывающие,

{• • ■} как объекты данного типа

должны отвечать void turnteft () на различные сообщения

void fire С)

} Рис. 5.22. Структура класса, описывающего лазерное оружие в компьютерной игре

Например, класс LaserClass, описывающий лазеры в нашей компьютерной игре, изображен на рис. 5.22. (Более детальное описание этого класса приводится позднее на рис. 5.24.) Любой объект, созданный по этому образцу, будет включать в себя

целочисленную переменную RemainingPower и три процедуры — turnRight, turnLeft и f i re, описывающие шаги для выполнения поворота направо, поворота налево и выстрела. Переменная объекта, такая как RemainingPower, называется переменной экземпляра (instance variable), а процедура объекта называется методом (method) (или, согласно терминологии языка C++, функцией-членом (member function)). Обратите внимание на то, что на рис. 5.22 переменная экземпляра RemainingPower объявляется с помощью оператора описания, подобного тому, который мы обсуждали в разделе 5.3, а методы описываются как процедуры и функции, рассматриваемые нами там же. В самом деле, объявление переменных и описание методов, в сущности, являются понятиями императивного программирования.

CORBAи RMI

Принципы объектно-ориентированного программирования используются при создании общесетевых систем программного обеспечения. Для таких систем разрабатываются общесетевые инфраструктуры, с помощью которых объекты могут обмениваться сообщениями по сети. Одна из технологий построения распределенных приложений называется CORBA (Common Object Request Broker Architecture — обобщенная архитектура обработчика объектных запросов). Она представляет собой систему инструкций для организации передачи сообщений между объектами. Другая технология называется RMI (Remote Method Invocation — удаленный вызов метода). Эта технология была разработана компанией Sun Microsystems и поддерживается программной средой Java, (более подробно с языком Java мы познакомимся позже в этой главе.) Разработчики программного обеспечения, использующие программную среду Java, находят, что технология RMI очень удобна при создании объектов, которые будут взаимодействовать с другими Java-объектами. Технология же CORBA обычно применяется при создании объектов в других языках программирования.

Описав класс LaserClass, мы можем объявить три переменных типа LaserClass с помощью оператора

LaserClass Laserl. Laser2. Laser3;

Обратите внимание на то, что такая же конструкция используется для описания трех целочисленных переменных х, у и z:

int x. у. 2;

Оба эти оператора состоят из имени типа и списка объявляемых переменных. Различие же заключается в том, что элемент, присвоенный переменной х, создается согласно заранее определенному шаблону целого числа (предопределенный тип данных), в то время как элемент, присвоенный переменной Laserl, создается согласно шаблону, определенному в программе как класс.

В языке C++ в результате выполнения приведенного выше оператора будут созданы три объекта типа LaserClass и присвоены переменным Laserl, Laser2 и Laser3. Однако в языках Java и С# будут просто созданы переменные, которым затем можно присвоить значения. Для того чтобы создать объект типа LaserCl ass и присвоить его переменной Laserl, в этих языках нужно использовать оператор

LaserClass Laserl = new LaserClassO;

Такой оператор не только описывает переменную типа LaserClass, но и создает новый объект, используя для этого шаблон LaserClass, и присваивает его пере-

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

int х = 3;

не только описывает тип переменной х, но и присваивает новой переменной значение 3.

Вне зависимости от того, с каким языком мы работаем, создав объекты и назначив им имена Laserl, Laser2 и Laser3, мы можем продолжить нашу программу, вызывая соответствующие методы этих объектов. Например, чтобы объект Laserl выполнил метод fire, нужно использовать оператор

Laserl.fire О:

А для того чтобы объект Laser2 выполнил метод turnLeft, используется оператор

Laser2.turnLeft О:

Прежде чем продолжить, давайте рассмотрим отношение понятий класса и объекта. Класс представляет собой шаблон, по которому создаются объекты: Один класс можно использовать для создания большого количества объектов. Часто объект называют экземпляром класса (instance). Следовательно, в нашей компьютерной игре имена Laserl, Laser2 и Laser3 используются для обозначения экземпляров класса LaserClass.

Конструкторы

После создания объекта нужно задать некоторые его характеристики. Например, в нашей компьютерной игре лазеры могут иметь разную начальную мощность. Значит, переменной экземпляра RemainingPower в разных объектах должно быть присвоено разное начальное значение. Инициализация переменных осуществляется специальными функциями, которые называются конструкторами (constructor). При создании объекта класса они вызываются автоматически. Конструктор задается внутри описания класса, и его имя совпадает с именем класса, к которому он принадлежит.

Более подробное описание класса LaserClass приведено на рис. 5.23. Обратите внимание на то, что конструктор определен как метод с именем LaserClass. Этот метод присваивает переменной экземпляра RemainingPower значение, которое передается ему в качестве параметра. Таким образом, при создании объекта класса выполняется этот метод, и переменной RemainingPower присваивается необходимое значение.

Фактические параметры, которые использует конструктор, обычно задаются в виде списка параметров в операторе создания объекта. Таким образом, чтобы создать два объекта типа LaserClass: один с именем Laserl и начальной мощностью 50, а другой с именем Laser2 и начальной мощностью 100, программист C++ напишет:

LaserClass Laserl (50). Laser2 (100);

Java- и С#-программисты для этой цели воспользуются операторами

LaserClass Laserl - new LaserClass (50): LaserClass Laser2 = new LaserClass (100):


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: