Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
GoslingJava2.doc
Скачиваний:
139
Добавлен:
23.02.2016
Размер:
2.39 Mб
Скачать

1.10.Расширение класса

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

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

Если подкласс не переопределяет (override) поведение суперкласса, то он наследует все свойства суперкласса, поскольку, как уже говорилось, расширенный класс наследует поля и методы суперкласса.

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

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

У Sony имеются и другие модели плееров. Более поздние серии расширяют возможности базовой модели— они создают подклассы на ее основе и наследуют от нее свойства и поведение.

Давайте посмотрим, как происходит наследование в Java. Расширим наш класс Point, чтобы он представлял пиксель на экране монитора. В новом классе Pixel к координатам x и y добавляется информация о цвете пикселя:

class Pixel extends Point {

Color color;

public void clear() {

super.clear();

color = null;

}

}

Класс Pixel расширяет как данные, так и поведение своего суперкласса Point. Для данных это означает, что в классе Pixel появляется дополнительное поле color. Pixel также расширяет поведение Point, переопределяя метод clear класса Point. Эта концепция наглядно изображена на рисунке:

Объект Pixel может использоваться в любой программе, которая рассчитана на работу с объектами Point. Если методу необходимо передать параметр типа Point, можно вместо него передать объект Pixel— все будет нормально. Вместо объекта класса Point можно пользоваться объектом подкласса Pixel; это явление известно под названием “полиморфизм”— один и то же объект (Pixel) выступает в нескольких (поли-) формах (-морф) и может использоваться и как Pixel, и как Point.

Поведение Pixel расширяет поведение Point. Оно может совершенно преобразиться (например, работа с цветами в нашем примере) или будет представлять собой некоторое ограничение старого поведения, удовлетворяющее всем исходным требованиям. Примером последнего может служить объект класса Pixel, принадлежащий некоторому объекту Screen (экран), в котором значения координат x и y ограничиваются размерами экрана. В исходном классе Point значения координат могли быть произвольными, поэтому ограниченные значения координат все равно лежат в исходном (неограниченном) диапазоне.

Расширенный класс часто переопределяет поведение своего суперкласса (то есть класса, на основе которого он был создан), по-новому реализуя один или несколько унаследованных методов. В приведенном выше примере мы переопределили метод clear, чтобы он вел себя так, как того требует объект Pixel,— метод clear, унаследованный от Point, знает лишь о существовании полей Point, но, разумеется, не догадывается о присутствии поля color, объявленного в подклассе Pixel.

Упражнение 1.12

Напишите набор классов, отражающих структуру семейства плееров Sony Walkman. Воспользуйтесь методами, чтобы скрыть все данные, объявите последние с ключевым словом private, а методы— public. Какие методы должны принадлежать базовому классу Walkman? Какие методы добавятся в расширенных классах?

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]