ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ*
В разделе 5.1 уже говорилось, что объектно-ориентированная парадигма предусматривает разработку активных про- граммных модулей, называемых объектами, каждый из которых содержит процедуры, описывающие реакцию объекта на различные входные сигналы. Эти внутренние процедуры называются методами (или функциями-членами – в терминологии языка C++). Объектно-ориентированный подход к решению задачи состоит в выявлении и описании необходимых объектов, а также связанных с ними методов в виде самодостаточного отдельного программного модуля. В соответствии с этим, объ- ектно-ориентированные языки программирования предоставляют операторы и другие средства для реализации этих идей. Некоторые из них мы рассмотрим в данном разделе.
Классы и объекты. Рассмотрим процесс разработки программы, моделирующей функционирование малого предпри- ятия. Под малым предприятием подразумевается частное предприятие, на котором работает не более 25 сотрудников. Наша задача – создать программу для исследования влияния, которое могут оказывать на подобные предприятия различные изме- нения, происходящие в экономике. Следовательно, необходимо разработать программу, которая будет моделировать дея- тельность нескольких таких предприятий и отслеживать, как они взаимодействуют друг с другом и внешним окружением. Используя объектно-ориентированный язык, мы могли бы описать каждое такое предприятие как объект с внутренними ме- тодами, определяющими его реакцию на воздействия внешнего мира.
В языках C++ и Java для объявления, что имя BusinessX будет использоваться для ссылки на объект "типа" Small-
Business, мы могли бы применить следующий оператор:
SmallBusiness BusinessX;
Обратите внимание, что этот оператор ничем не отличается от используемого в языке программирования С для объяв- ления, что Cost является переменной типа integer:
int Cost;
Несмотря на общее сходство, эти операторы имеют несколько существенных отличий. Одно из них состоит в том, что "тип" объекта принято называть классом. Таким образом, класс – это описание структуры объекта. В некотором смысле класс представляет собой шаблон, который используется для создания объекта. Другое отличие заключается в том, что тип integer является встроенным типом языка программирования, тогда как класс SmallBusiness – это "тип", который должен быть описан в каком-то месте программы.
Для описания классов многие объектно-ориентированные языки программирования включают специальные операторы, подобные представленному ниже:
class SmallBusiness
{
.
.
.
};
Первая строка этого объявления означает, что блок операторов внутри фигурных скобок определяет класс под названи- ем Small-Business. Внутри фигурных скобок объявляются разнообразные методы, описывающие, как объект типа SmallBusiness должен реагировать на различные внешние воздействия. Объявления методов напоминают описание обычных процедур и функций.
Обобщая сказанное, можно сделать вывод, что в нашей моделирующей программе сначала следует воспользоваться оператором class для описания класса с именем SmallBusiness, а затем поместить операторы объявления приведенного выше типа для указания, что в программе будут использоваться объекты.
Наследование. К сожалению, многие малые предприятия, работу которых мы собираемся моделировать, имеют разные особенности. Предприятие, принимающее заказы на доставку товаров по почте, должно отвечать на поступающие заявки и пополнять свой запас товаров на складе. Тогда как небольшое предприятие, занимающееся консалтингом, взаимодействует со своими клиентами совершенно иным образом. Однако между этими предприятиями достаточно много общего. Например, все они подчиняются одним и тем же законам налогообложения, одинаково обрабатывают платежные ведомости и сходным образом пополняют запасы канцелярских товаров.
Для того чтобы упростить описание объектов, имеющих больше одинаковых свойств, чем разных, многие объектно- ориентированные языки программирования позволяют одному классу включать свойства другого посредством механизма, называемого наследованием (inheritance). Предположим, что для разработки нашей программы моделирования будет исполь- зоваться язык Java. В этом случае сначала можно было бы применить приведенный выше оператор объявления для описания класса SmallBusiness, содержащего те методы, которые являются общими для всех малых предприятий в данном прило- жении.
А затем использовать приведенный ниже оператор для описания другого класса, например, с именем MailOrderBusi- ness:
class MailOrderBusiness extends SmallBusiness
{
.
.
.
}
В языке C++ нужно просто заменить слово extends двоеточием. Этот оператор означает, что данный класс наследует все свойства класса SmallBusiness, а также дополнительно имеет свойства, указанные внутри фигурных скобок. Анало- гично можно было бы описать и другой класс под названием ConsultingBusiness, который также наследует свойства класса SmallBusiness и одновременно обладает свойствами, характерными только для предприятий, занимающихся кон- салтингом. После того как указанные выше классы будут описаны, появится возможность использовать следующие операто- ры:
MailOrderBusiness BusinessX; ConsultingBusiness BusinessY;
Эти операторы указывают, что переменная BusinessX является объектом, описывающим малое предприятие, прини- мающее заказы по почте, а переменная BusinessY – это объект, описывающий малое предприятие, занимающееся консал- тингом.
Инкапсуляция и полиморфизм. Существование множества объектов, имеющих сходные, но все же отличающиеся ха- рактеристики, приводит к явлению, напоминающему перегрузку, речь о которой шла в разделе 5.2. (Напомним, что понятие перегрузки означает использование одного и того же символа, например знака +, для представления разных операций в зави- симости от типа указанных операндов.) Предположим, что объектно-ориентированный графический пакет состоит из разно- образных объектов, каждый из которых описывает некоторую фигуру (окружность, прямоугольник, треугольник и т.п.). Ка- ждое изображение состоит из совокупности таких объектов. Для каждого объекта известны его размер, положение и цвет, а также то, как он реагирует на сообщения, требующие от него определенных действий, например перемещение в новое поло- жение или отображение самого себя на экране. Для того чтобы нарисовать изображение в целом, мы просто посылаем сооб- щение "нарисуй себя" каждому из объектов, образующих это изображение. Однако программы, рисующие отдельные объек-
ты, изменяются в зависимости от их формы – процесс рисования квадрата отличается от процесса рисования окружности. Дан- ный механизм специфической интерпретации одного и того же сообщения называется полиморфизмом (polymorphism), а соот- ветствующее сообщение – полиморфным.
Другим свойством, связанным с объектно-ориентированным программированием, является инкапсуляция (encapsulation), которая означает ограничение доступа к внутренним свойствам объекта. Если сказать, что некоторое свойст- во объекта является инкапсулированным, это будет равноценно утверждению, что доступ к этому свойству может иметь только сам объект. Инкапсулированные свойства называются закрытыми (private), а свойства, доступные извне объекта, – открытыми (public). Например, рассмотрим объект нашей программы для моделирования бизнеса, имеющий "тип" HailOrderBusiness. Следует ожидать, что этот объект будет содержать метод, описывающий его реакцию на поступле- ние заказа. Прочим объектам потребуется обращаться к данному методу в целях передачи некоторого заказа. Следовательно, доступ к этому методу должен быть открытым. Однако детальные сведения о том, как именно данное предприятие выполня- ет заказ, должны быть доступны только внутри объекта. Это означает, что все эти детали должны быть закрытыми. Боль- шинство объектно-ориентированных языков программирования позволяет программисту определять непосредственно в опи- сании класса, какие части объекта являются открытыми, а какие – закрытыми. Например, описание класса MailOrder- Business на языке Java может выглядеть следующим образом:
class MailOrderBusiness extends SmallBusiness
{
public ... private ... private ... public ...
}
Здесь ключевые слова public и private в начале описания каждого компонента используются для того, чтобы указать вид доступа к ним.
1. В чем заключается отличие между объектом и классом?
2. Предположим, что классы PartTimeEmployee (Временный работник) и FullTimeEmployee (Постоянный ра- ботник) наследуют свойства класса Employee (Работник). Укажите, какими свойствами, по Вашему мнению, должен обла- дать каждый из этих классов.
3. Что такое инкапсуляция?
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.