Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика и ВТ Брукшир.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.07 Mб
Скачать

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

После создания объекта нужно задать некоторые его характеристики. Например, в нашей компьютерной игре лазеры могут иметь разную начальную мощность. Значит, переменной экземпляра 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):

5.5.4Дополнительные возможности

Предположим, мы хотим изменить нашу компьютерную игру так, чтобы игрок, набравший определенное количество очков, мог перезарядить один из лазеров. Эти лазеры будут обладать такими же свойствами, как и остальные, за исключением того, что их можно будет перезаряжать.

Для упрощения описания объектов с похожими, но все же разными характеристиками большинство объектно-ориентированных языков позволяют одному классу включать в себя свойства другого. Эта система называется наследованием (inheritance). Предположим, например, что для написания программы мы использовали язык Java. Прежде всего, мы можем использовать операторы, о которых говорилось ранее, чтобы определить класс LaserClass, описывающий свойства, общие для всех лазеров программы. Затем, чтобы описать другой класс, Rechargeablelaser, можно использовать выражение

Class RechargeableLaser extends LaserClass {

}

В языках C++ и С# нужно просто заменить слово extends двоеточием. Этот оператор обозначает, что класс наследует все свойства класса LaserClass, а также содержит свойства, описанные в фигурных скобках. В нашем случае фигурные скобки будут содержать новый метод (например, recharge), описывающий действия, которые необходимо выполнить для возвращения переменной экземпляра первоначального значения. После того как все классы определены, для объявления переменных Laserl и Laser2, обозначающих обычные лазеры, можно использовать оператор

LaserClass Laserl. Laser2:

А для объявления переменных Laser3 и Laser4, обозначающих лазеры, которые имеют дополнительные свойства, описанные в классе RechargeableLaser, можно использовать оператор

RechargeableLaser Laser3. Laser4;

С# И .NET FRAMEWORK (каркас сетевых приложений)------------------------------

Для того чтобы упростить процесс разработки программного обеспечения, отвечающего потребностям современного пользователя — такого как создание веб-страниц, которые взаимодействуют между собой, — компания Microsoft создала программную среду .NET Framework. Кроме всего прочего эта среда включает в себя набор элементов (.NET Framework Class Library — библиотека классов среды .NET Framework), которые можно использовать в качестве абстрактных инструментов при разработке прикладных программ. Хотя большую часть этой библиотеки можно найти в системах программного обеспечения, уже выпущенных компанией Microsoft (например, в Visual Basic), был разработан новый язык программирования С#. Как язык программирования С# мало чем отличается от C++. Новшество этого языка заключается в том, что он обещает быть основным языком разработки программного обеспечения с помощью среды .NET Framework. Хотя язык С# и среду .NET Framework рекомендуется использовать только на машинах с операционными системами компании Microsoft, язык С#, вероятно, будет очень популярен в скором будущем, поскольку эти системы являются широко распространенными.

В результате применения наследования появляется множество объектов со сходными, но все-таки различными характеристиками, что напоминает явление перегрузки операций (раздел 5.2). Вспомним, что перегрузкой операций называется использование одного символа, например +, для представления разных операций в зависимости от типа операндов. Предположим, что пакет машинной графики включает в себя объекты, представляющие разные фигуры (окружность, прямоугольник, треугольник и т. д.). Отдельное изображение состоит из набора этих объектов. Каждый объект обладает такими характеристиками, как размер, местоположение и цвет, а также отвечает на указания переместиться в другое место или вывести себя на экран. Для того чтобы нарисовать изображение, нужно послать соответствующее сообщение каждому объекту этого изображения. Однако для выведения на экран объектов разной формы используются различные процедуры, так как процесс рисования окружности совершенно отличается от процесса рисования квадрата. Такая возможность по-разному интерпретировать сообщение в зависимости от объекта называется полиморфизмом (polymorphism), а само сообщение называется полиморфным.

Другая возможность объектно-ориентированного программирования — это инкапсуляция (encapsulation), то есть ограничение доступа к внутренним свойствам объекта. Инкапсуляция переменных и функций членов класса внутри объекта означает, что к ним может обращаться только сам объект. Члены класса, защищенные от внешних воздействий, называются закрытыми, или частными (private). Члены класса, которые доступны извне объекта, называются открытыми (public).

Вернемся к нашему классу LaserCl ass (см. рис. 5.22). Он включает в себя переменную экземпляра RemainingPower и три метода — turnRight, turnLeft и fire. Эти методы должны быть доступны другим программным единицам, чтобы экземпляр класса выполнял соответствующие действия. Но значение переменной Remaining Power должно меняться только внутренними методами объекта. Никакая другая программная единица не должна иметь прямого доступа к этому значению. Для этого нужно указать, что переменная RemainingPower является закрытой, а методы turnRight, TurnLeft и fire — открытыми (рис. 5.24).

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