Класс - это основа основ парадигмы объектно-ориентированного программирования. Он представляет собой, в зависимости от конкретной задачи, стоящей перед разработчиком, более или менее полную модель (см. «Абстракция»)
той или иной реальной вещи или явления. Элементы этой модели называются членами класса (class members). Различают две разновидности членов класса - свойства и методы.
Свойства (properties), или атрибуты (attributes). Это такие характеристики моделируемой вещи или явления,
значения которых можно измерить или перечислить: цвет, скорость, номер, количество, название, размер и т. п. Они представлены в классе переменными соответствующего типа.
Методы (methods), или возможности (features). Это отображение поведения, свойственного вещи. Методы - это, по сути, те же функции. Они представляют действия, которые моделируемая
вещь может выполнять. К рассмотрению методов мы еще вернемся (см. «Метод»).
Рассмотрим сказанное более подробно на примере класса Автомобиль. Будучи абстрактной характеристикой вещи (в данном случае, автомобиля), наш класс должен характеризовать не какой-то конкретный автомобиль (мой, ваш, соседа и т. п.), а некий абстрактный автомобиль, понятие автомобиля вообще. Как и любая
вещь, наш абстрактный автомобиль, с одной стороны, обладает набором определенных свойств, а, с другой - набором действий, которые он может производить. Например, свойства: марка, год выпуска, объем мотора, мощность мотора, текущая скорость, максимальная скорость, расход топлива, пробег
и т. п.; и действия: включить мотор, выключить мотор, набрать скорость, повернуть налево, повернуть направо, затормозить, включить свет в салоне и т. д.
Объект
Объект является конкретным экземпляром, примером (instance) того или иного класса.
Например, такой конкретизацией класса Автомобиль мог бы явиться объект автомобиля со следующими свойствами:
название: Антилопа-Гну
марка: лорен-дитрих
владелец: Адам Козлевич
пункт отбытия: Арбатов
пункт назначения: Черноморск
скорость: 20 км/ч
Совокупность текущих значений
свойств объекта называется его состоянием (state).
Метод
Методы представляют собой способность объекта определенного класса к тем или иным действиям. В рассмотренном ранее примере автомобиль мог совершать повороты, изменять скорость и т. п. Кошка может
мяукать, есть, пить, спать, прыгать, вставать, ложиться и садиться.
Иногда бывает целесообразно определить в виде методов не только те действия, которые способна выполнять моделируемая вещь, но и те, которые могут выполнены с этой вещью. Например, прибор может быть включен или выключен, переключен в другое состояние и т. д.
Хоть методы определяются в контексте класса, но применяться они должны по отношению к конкретному объекту этого класса. Например, вызов метода включить
мотор применительно к объекту автомобиля с именем Антилопа-Гну должен включать мотор именно этого автомобиля и никакого другого.
Типичное использование методов - получение (чтение) или установка (запись) значений свойств объекта. Например, для получения значения текущей скорости автомобиля может быть использован метод получить текущую скорость.
Сообщение
В некоторых объектно-ориентированных языках приложениях активно поддерживается система обмена сообщениями между объектами приложения (в частности, о происходящих во время работы приложения событиях). Типичный механизм обработки подобных сообщений - вызов соответствующего метода в объекте, принимающем сообщение.
Наследование
Моделирование реальных вещей и явлений было бы не таким эффективным, если бы не существовало механизма наследования. Этот механизм позволяет создавать классы-наследники, автоматически получающие все свойства и поведение класса-предка, но способные их изменять (перекрывать) и расширять.
Например, от общего класса-предка Автомобиль могут быть унаследованы классы Лорен-дитрих,
Ситроен, Крайслер, Мерседес и т. д. При этом наследники изначально будут обладать всеми свойствами и методами, которыми обладает класс Автомобиль. Однако, эти свойства и методы можно сделать более специфичными для каждой марки автомобиля (скажем, устанавливать значение свойства марка автомобиля). Кроме того, при необходимости можно добавлять новые свойства и
методы, присущие конкретной марке автомобиля, но отсутствующие у других (метод включить кондиционер не нужен для автомобиля Лорен-дитрих, но может понадобиться для автомобиля Мерседес).
Инкапсуляция
Скрытие деталей реализации класса
от объектов других классов называется инкапсуляцией. Такое скрытие может быть произведено при помощи разграничения доступа к свойствам и методам класса.
Публичные члены класса могут быть доступны как из самого класса, так и вне его. Защищенные члены доступны только из самого класса и его наследников. Наконец, приватные члены доступны только из самого класса.
Например, публичный метод опустить дверное стекло может вызывать приватный метод механического вращения специальной
рукоятки в одном случае и нажатия на кнопку автоматического опускания стекла в другом. Однако, для объекта, инициирующего опускание стекла детали реализации этого процесса будут невидимы.
Рекомендуется максимально скрывать (ограничивать непосредственный доступ) к свойствам. Вместо этого следует включать в предоставляемый набор публичных методов (интерфейс) методы для чтения и записи приватных и защищенных свойств.
Абстракция
Максимально допустимое упрощение реализуемой модели до уровня, все еще позволяющего решить поставленную задачу, называется абстракцией. С учетом возможности использования механизма наследования, это означает, в том числе, и работу с объектом на том уровне абстракции, который больше всего соответствует решаемой задаче.
Например, класс Кошка может иметь предка (Домашнее животное) и наследников (Ангорская кошка, Британская короткошерстная кошка, Персидская кошка и др.). В зависимости от обстоятельств, объект Неко может рассматриваться как принадлежащий либо к классу Персидская кошка, либо к классу Кошка, либо к классу Домашнее животное.
Полиморфизм
Разное поведение объектов различных (но родственных) классов в ответ на одно и то же сообщение или вызов одного и того же метода называется полиморфизмом.
Пусть в классе Домашнее животное определен метод произвести звук. Поскольку разные домашние животные производят
различные звуки, то наполнить этот метод конкретным содержанием на данном уровне абстракции не представляется возможным. Это следует сделать в классах-наследниках: например, объект класса Собака должен воспроизводить звук Гав-гав!, а объект класса Кошка - Мяу-мяу.
Контрольные
вопросы и задания
Ниже перечислены некоторые члены класса Монитор. Разделите их на свойства и методы.
размер по диагонали
включить
выключить
текущий режим
установить режим
яркость
контрастность
наличие встроенных звуковых колонок
Существует два объекта класса Монитор (монитор_1 и монитор_2). Какое действие должен оказать вызов метода включить у объекта
монитор_1?
Включить оба монитора.
Включить только первый монитор.
Включить только второй монитор.
Включить первый и выключить второй монитор.
Какие взаимоотношения между следующими классами представляются Вам наиболее вероятными?