Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
samples / Zaochniki / ООП.doc
Скачиваний:
28
Добавлен:
25.03.2015
Размер:
183.81 Кб
Скачать

№8 Расширение характеристик при наследовании классов

Одна из главных причин порождения одних классов от других состоит в том, что код базового класса уже обеспечивает часть функций, необходимых для производного класса. Чаще всего базовый класс почти такой, как вам нужен. Базовый класс может, например, содержать функцию, которая требует небольшой доработки. Написание заново нужной функции в производном классе является пустой тратой времени. Вместо этого C++ по­зволяет повторно использовать код в базовом классе, расширяя его настолько, насколько это необходимо. Все, что нужно сделать, — это переопределить в производном классе ту функцию родительского класса, которая вас не устраивает. Рассмотрим пример создания кнопки для использования в графическом пользовательском интерфейсе. Подобный интерфейс может создаваться на основе дерева наследования, изображенного на рис. 8.1.

Листинг 8.2. Порождение объекта кнопки для дальнейшего расширения характеристик

class Box { public:

Box (int x, int у, int width, int height) { }

void Display ( ) { }

};

class PushButton {

int state;

Box* outline; Рис. 8.1. Специализированный класс кнопки

Box* button;

public:

PushButton (int px, int py);

Void Display ( ) ;

~PushButton ( ) { }

};

PushButton : : PushButton (int x, int y)

{const int OUTLINE_WIDTH = 36;

const int OUTLINE_HEIGHT = 20;

const int BUTTON_WIDTH = 20;

const int BUTTON_HEIGHT = 10;

outline = new Box(x, y, OUTLINE_WIDTH, OUTLINE_HEIGHT);

int bx = x + (OOTLINE_WIDTH - BUTTON_WIDTH) / 2;

int by = у + (OUTLINE_HEIGHT - BOTTON_HEIGHT) /2;

button = new Box (bx, by, BUTTON_WIDTH, BUTTON_HEIGHT) ;

}

void PushButton : : ~Display ( )

outline->Display ( ); // отображение границы кнопки

button->Display ( );// отображение внутренней части кнопки

}

Класс PushButton отобразит на экране один прямоугольник, а внутри него — другой.

Предположим, нужно создать кнопку с пояснительной надписью. Неплохо было бы использовать класс PushButton, добавив функцию, рисующую пояснительный текст. Понятно, что нужно создать производный класс, использовав в качестве родительского PushButton, и расширить функцию Display (). Новый класс PushButtonWithTitle использует PushButton:: Display () для отображения кнопки, а затем выводит над­пись поверх кнопки. Дерево наследования представлено на рис. 8.3.

Класс Text не порожден от PushButtonWithTitle, а встроен в него. Объект класса Text создается и управляется из PushButtonWithTitle. В листинге 8.4 по­казано, как будет выглядеть соответствующий код:

Листинг 8.4. Расширение характеристик базового класса

// включить файл-заголовок для класса PushButton

class Text { public;

Text(int x, int y, char* string) { }

Void Display ( ) { }

};

class PushButtonWithTitle: public PushButton {

Text* title;

public:

PushButtonWithTitle (int x, int y, char* title);

Void Display ( ) ;

~PushButtonWithTitle ( ) { } Рис. 8.3. Класс для отображения надписи на кнопке

};

PushButtonWithTitle : : PushButtonWithTitle (int x, int y, char* legend):

PushButton (x, y)

{

Расширение характеристик PushButton находится в функции Display (). Новый класс имеет функцию с тем же именем, отображающую не просто гладкую кнопку, а кнопку, выводящую текст поверх нее.

Функция PushButtonWithTitle : : Display ( ) использует оператор разрешения видимости для доступа к ро­дительской функции. Причина использования оператора проста: две функции имеют одинаковые имена. Произ­водный класс вовсе не обязан работать с функцией с тем же именем, что и в базовом классе, но для ясности и одно­образности желательна содержательность имен функций.

title = new Text (x, y, legend);

}

void PushButtonWithTitle : : Display ( )

{PushButton : : Display ( ) ;

title->Display ( ) ;}

Соседние файлы в папке Zaochniki