Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Лафоре Р. -> "Объектно-ориентированное программирование в С++" -> 137

Объектно-ориентированное программирование в С++ - Лафоре Р.

Лафоре Р. Объектно-ориентированное программирование в С++ — М.: Питер, 2004. — 992 c.
Скачать (прямая ссылка): obektnoorentprogramm2004.djvu
Предыдущая << 1 .. 131 132 133 134 135 136 < 137 > 138 139 140 141 142 143 .. 341 >> Следующая


Помните пример C0UNTPP3 из главы 8 «Перегрузка операций»? Эта программа использует объект класса Counter как счетчик. Он мог быть инициализирован нулем или некоторым числом при использовании конструктора, увеличен методом operator++() и прочитан с помощью метода get_count(). Базовый и производный классы 363

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

Мы могли бы вставить метод уменьшения прямо в исходный код класса Counter. Однако существует несколько причин, по которым мы не можем себе этого позволить. Во-первых, класс Counter прекрасно работает, на его отладку затрачена масса времени (конечно, в данном случае это преувеличение, но подобная ситуация может иметь место для более сложных и больших классов). Если мы вмешаемся в исходный код класса Counter, то его тестирование и отладку придется проводить вновь, тратя на это время.

Во-вторых, в некоторых ситуациях мы просто не имеем доступа к исходному коду класса, например, если он распространяется как часть библиотеки классов (мы обсудим это позднее в главе 13 «Многофайловые программы»).

Во избежание этих проблем мы можем использовать наследование для создания классов на базе Counter. Ниже представлен листинг программы C0UNTEN, в которой появится новый класс CountDn, добавляющий операцию уменьшения к классу Counter1: // counten.cpp

//inheritance with Counter class finclude <iostream.h> using namespace std: //////////////////////////////////////////////////////////

class Counter //базовый класс

{

protected:

unsigned int count: //счетчик

public:

Counter ( ) : count ( 0 ) //конструктор без аргументов

I }

Counter ( int с ) : count ( с ) { }

unsigned int get_count ( ) const

{ return count; } // возвращает значение счетчика

Counter operator++ ( ) //увеличивает значение //счетчика (префикс) { return Counter ( ++count ): }

}:

//////////////////////////////////////////////////////////

class CountDn : public CounterZ/производный класс {

public:

Counter operator-- ( ) //уменьшает значение счетчика { return Counter ( --count ): }

}:

////////////////////////////////////////////////////////// int main ( )

1 Все исходные тексты, приведенные в книге, вы найдете по адресу http://www.piter.com/download. 364 Глава 9. Наследование

CountDn cl:

// объект cl //вывод на печать //увеличиваем Cl три раза //вывод на печать

cout « "\n cl=" « cl.get_count ( ) ++cl: ++cl: ++Cl;

cout « "\n cl=" « cl.get_count ( ) --cl: --cl: //уменьшаем с! два раза cout « "\n cl=" « cl.get_count ( ) cout « end!:

//вывод на печать

return 0;

Программа начинается с описания класса Count, которое не изменилось с момента его первого появления в C0UNTPP3 (с одним небольшим исключением, которое мы рассмотрим позднее).

Заметим, что для простоты мы не включаем в эту программу операцию постфиксного увеличения, требующую использования вторичной перегрузки операции ++.

Вслед за описанием класса Count в программе определен новый класс, CountDn. Он включает в себя новый метод operator~(), который уменьшает счетчик. В то же время CountDn наследует все возможности класса Counter: конструктор и методы.

В первой строке описания класа CountDn указывается, что он является производным классом от Counter.

class CountDn : public Counter

Для этого используется знак двоеточия (не путать с двойным двоеточием, которое является операцией, использующейся для определения области действия), за ним следует ключевое слово public и имя базового класса Counter. Таким образом, мы установили отношение между классами. Другими словами, эта строка говорит нам о том, что CountDn является наследником класса Counter (значение ключевого слова public мы рассмотрим позднее).

Обобщение в диаграммах классов в UML

В UML наследование называют обобщением, так как базовый класс — это более общая форма его производных классов. Другими словами, наследник является более специализированной версией порождающего класса. (Мы познакомились с UML в главе 1 «Общие сведения» и встречались с диаграммами классов в главе 8 «Перегрузка операций».) Диаграмма обобщения для программы C0UNTEN показана на рис. 9.2.

В диаграммах UML обобщение показано стрелкой с треугольным окончанием, соединяющей базовый и производный классы. Вспомним, что стрелка означает наследование от, производный от или более специализированная версия. Направление стрелки подчеркивает, что производный класс ссылается на методы и поля базового класса, но при этом базовый класс не имеет доступа к производному.

Определение производного класса Базовый и производный классы

365

Рис. 9.2. Диаграмма классов UML для примера COUNTEN

Заметим, что на диаграмме отражены поля и методы классов. Рассмотрим элементы диаграммы, представляющие собой классы. В верхней части прямоугольника, обозначающего класс, расположено название, ниже — поля, а еще ниже — методы.
Предыдущая << 1 .. 131 132 133 134 135 136 < 137 > 138 139 140 141 142 143 .. 341 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100