5. Основные принципы ООП
5.1 Сообщения
Первый принцип ООП: действия задаются в форме сообщений, посылаемых одними объектами другим.
Действие в ООП инициируется посредством передачи сообщения объекту, ответственному за выполнение действия. Сообщение содержит запрос на осуществление действия и сопровождается дополнительной информацией (параметрами), необходимой для выполнения действия (например, при покупке компьютера параметрами является описание конфигурации и деньги).
Получатель (receiver) – это объект, которому посылается сообщение от объекта-клиента (client или sender). Если получатель принимает сообщение, то на него автоматически возлагается ответственность за выполнение указанного действия. В качестве реакции на сообщение получатель запустит некоторый метод, чтобы удовлетворить принятый запрос.
Понятие обязанности или ответственности за выполнение действия является фундаментальной концепцией ООП. Запрос выражает только стремление получить желаемый результат, а не способ его достижения. Полный набор обязанностей, связанных с определенным объектом, часто определяется с помощью термина "протокол".
5.2 Скрытие информации
При пересылке сообщений действует важный принцип скрытия информации: клиенту, посылающему запрос, ничего не требуется знать о способе его выполнения. Если уже существует объект, который может выполнить запрос, то получатель может переадресовать запрос ему. Т.о., ООП поощряет разработку повторно используемых компонент программного обеспечения.
Скрытие информации является важным принципом и в традиционных языках программирования. Пересылка сообщений отличается от вызова процедуры, хотя в обоих случаях имеется последовательность точно определенных действий, выполняемых в ответ на запрос. Выделяются два отличия. Во-первых, у сообщения имеется вполне конкретный получатель – объект, которому послано сообщение (хотя на уровне реализации вполне может быть так, что получатель передается в качестве первого параметра процедуры). Во-вторых, интерпретация сообщения (вызываемый метод) зависит от получателя и является различной для различных получателей (например, в разных компьютерных магазинах сборка компьютера может выполняться по-разному).
Часто конкретный получатель неизвестен вплоть до выполнения программы. В таком случае говорят, что имеет место позднее связывание между сообщением (именем процедуры или функции) и фрагментом кода (методом), используемым в ответ на сообщение. Эта ситуация противопоставляется раннему связыванию (на этапе компиляции и компоновки программы) имени с фрагментом кода, что происходит при традиционных вызовах процедур.
5.3 Наследование
Все объекты являются представителями, или экземплярами, классов. Понятие "класс" обозначает категорию объектов, имеющих общие черты. Классы будем обозначать именами, начинающимися с заглавной буквы 'C' (от слова class).
Класс включает в себя (инкапсулирует) набор свойств (переменных), определяющих состояние объекта данного класса, и набор действий (методов), определяющих поведение объектов данного класса.
Метод, выполняемый объектом-получателем в ответ на сообщение, определяется классом, к которому принадлежит получатель сообщения. Все объекты одного класса используют одни и те же методы в ответ на одинаковые сообщения.
Организация знаний о классах представляется в виде иерархии. Классы представляются в виде иерархической древовидной структуры, в которой более абстрактные (т.е. более общие) классы располагаются в корне дерева, а более специализированные классы располагаются на его концах, в ветвях. Древовидные структуры в программировании принято изображать в направлении "от корня вниз" (рис. 1.1).
Рис. 1.1. Иерархическое дерево классов для некоторых объектов материального мира
Идея наследования состоит в том, что классы могут быть организованы в иерархическую структуру с наследованием свойств. Дочерний класс (или подкласс) наследует свойства родительского класса (или надкласса), расположенного выше в иерархическом дереве. Абстрактный родительский класс – это класс, не имеющий экземпляров. Он используется только для порождения подклассов.
5.4 Полиморфизм
Информация, содержащаяся в подклассе, может переопределять информацию, наследуемую из родительского класса (например, на рис. 1.1 утконосы отнесены к млекопитающим, но они являются яйцекладущими). Очень часто при реализации такого подхода метод, соответствующий подклассу, имеет то же имя, что и соответствующий метод в родительском классе. При поиске метода, подходящего для обработки сообщения, используется следующее правило: поиск метода начинается с методов, принадлежащих классу получателя. Если подходящий метод не найден, то поиск продолжается для родительского класса.
Применение различных методов разными объектами для обработки одного сообщения является примером полиморфизма.
|