Главная » Java » Наследование Java

0

Одно из основных преимуществ объектного подхода к программированию состоит в возможности наследования (inheritance), или расширения (extending), функционального потенциала базового (родительского - superclass) класса при построении на его основе производного (дочернего - subclass) класса. Предоставляя в распоряжение программиста новые инструменты, производный класс сохраняет способность обращения ко всем элементам исходного класса. При создании дочернего класса тот наследует поля и методы базового класса.

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

Продолжим рассмотрение примера, касающегося производства компактных кассетных проигрывателей. Предположим, что ранее существовала базовая модель проигрывателя с одним гнездом для подключения наушников. В более поздних моделях предусмотрены два гнезда, которые позволяют пользоваться кассетой одновременно двум слушателям. Применяя термины объектно-ориентированного программирования, можно сказать, что модель с двумя гнездами расширяет функциональные возможности исходной модели, обладавшей одним гнездом. Новая модель наследует характеристики базовой и обладает дополнительными свойствами.

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

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

Рассмотрим при мер наследования класса. Мы расширим ранее созданный класс Роint таким образом, чтобы обеспечить возможность представления данных об экранном пикселе. Новый класс рiхеl, помимо хранения координат х и у пикселя, предусматривает средства описания его цвета.

class Pixel extends Point {

       Color color;

                              

       public void Clear() {

                   super.clear();

                   color = null;

       }

}

 

Производный класс рiхеl расширяет как набор данных, так и характеристики поведения базового класса point он вводит новое поле со1ог типа Color и переопределяет метод с1еаг класса Роint.

Объекты класса рiхеl могут быть использованы в любом коде, предназначенном для работы с объектами класса Роint. Например, если в списке параметров метода предусмотрен объект типа point, ничто не запрещает передать вместо него объект рiхеl – программа по-прежнему будет работать. Если в вашем распоряжении имеется объект типа рiхеl, вы вольны пользоваться любым кодом, оперирующим объектами Роint. Подобный механизм языка носит название полиморфизма (роlуmогрhism): скажем, один и тот же объект рiхе1 допускает интерпретацию в нескольких (poly-) формах (-morph) - он способен выступать в роли собственно объекта рiхеl и принимать облик объекта Роint.

Класс рiхеl расширяет (extends) набор функций класса Роint. Расширенные функции могут быть совершенно новыми (как, например, средства хранения информации о цвете точки); в других случаях они способны накладывать дополнительные ограничения в рамках исходной модели. Примером класса, реализующего ограничения, может послужить тот же рiхеl, в котором предполагается, что соответствующие объекты пикселей должны "обитать" в пределах экрана, Т.е. значения их координат х и у обязаны удовлетворять условиям, накладываемым объектом некоего типа Screen. Если базовый класс Роint сам по себе гипотетически допускает задание координат из ограниченного диапазона, производный класс рiхеl, вводящий подобное ограничение на практике, никоим образом не нарушит правила поведения, установленные базовым классом.

Производный класс часто переопределяет функциональные характеристики базового, предлагая новые версии одного или нескольких унаследованных методов. С этой целью в тексте производного класса объявляются методы с теми же сигнатурами и типами возвращаемых значений, что и в базовом. В примере класса Рiхеl мы переопределили метод с1еаг, чтобы реализовать функции, которые требуются для решения новой задачи. Унаследованный метод с1еаг базового класса Роint, который в данном случае может быть вызван командой super.clear() (подробнее об этой конструкции рассказано в следующем разделе), способен обращаться только к членам "родного" класса Роint и, что вполне очевидно, не "осведомлен" о "новшествах", таких как поле соlor, класса рiхеl.

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии