Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 14
Пользователь: Fafuka

Пользователей: 13,372
новичок: vausoz
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Медиа плейер на Delphi + Пояснительная записка
Моделирование процесса обработки заданий на вычислительном центре на GP...
База данных междугородних телефонных разговоров на Delphi

Простое открытое наследование
Вернемся к разработке класса денег. Ранее мы реализовали простой класс, позволивший нам выполнять операции с рублями (см. главы 1 и 2). Однако практически в любой финансовой системе необходимо оперировать и другой валютой, например долларами или франками. Давайте рассмотрим мультивалютную систему, в которой используются рубли, доллары и евро. Понятно, что разные валюты обладают некоторыми общими свойствами, поэтому можно использовать механизм наследования. Однако так как мы пока не имеем опыта применения механизма наследования, нам, очевидно, наряду с разработкой классов-наследников потребуется время от времени модифицировать базовый класс.
Совершенно ясно, что арифметические операции с любой валютой — одни и те же: нам надо складывать и вычитать деньги, делить деньги на деньги, умножать и делить деньги на число. Даже операция ввода может быть унифицирована, так как практически для всех валют (по крайней мере, для долларов и евро) каждый «рубль» состоит ровно из 100 «копеек». Различия проявляются только при выводе денежной суммы на экран — необходимо указывать, в какой валюте эта денежная сумма представлена. Таким образом, мы можем реализовать базовый класс TCurrency, в котором определено поле для денежной суммы и реализованы все перечисленные операции, кроме операции вывода. Тогда конкретную валюту (рубли, доллары или евро) можно будет реализовать путем открытого наследования. Интерфейс этого класса представлен в листинге i8.1. Реализация не изменяется, за исключением названия класса, поэтому приводить мы ее не будем.
Листинг 8.1. Интерфейс базового класса TCurrency для работы с денежными суммами
class TCurrency { public:
typedef unsigned int uint;
TCurrency(const long double &t=0.0); // конструктор
// методы
TCurrency& operator+=(const TCurrency &b); TCurrency operator-() { Summa = -Summa; return *this; }; TCurrency& operator++(){ return (*this+=1.0);} TCurrency operator++(int)
{ TCurrency t = *this; *this+=0.01; return t; }
TCurrency operator-(const TCurrency &a);
TCurrency& operator-=(const TCurrency &b);
TCurrency& operator/=(const double &b);
long double operator/(const TCurrency &b);
TCurrency operator/(const double &b);
TCurrency& operator*-(const double &b);
bool isNegative() { return (Summa < 0); } // дружественные функции
friend TCurrency operator+(const TCurrency &a, const TCurrency &b);
friend TCurrency operator*(const long double &a, const TCurrency &b);
friend TCurrency operator*(const TCurrency &a, const long double &b);
friend bool operator==(const TCurrency &a, const TCurrency &b);
friend bool operator!=(const TCurrency &a,const TCurrency &b);
friend bool operator<(const TCurrency &a,const TCurrency &b);
friend bool operator>=(const TCurrency &a,const TCurrency &b);
friend bool operator>(const TCurrency &a,const TCurrency &b);
friend bool operator<=(const TCurrency &a,const TCurrency &b);
friend istream& operator>>(istream& t, TCurrency &r); private:
long double Summa;
string toStringO const;
long double round(const long double &r);
};



Разберемся, какие дополнения или изменения придется внести в классы-наследники. Во-первых, это, конечно, операция вывода на экран. При этом наша приватная функция перевода числа в символьный вид может быть реализована в базовом классе, так как она должна работать одинаково для трех валют. Напишем первый вариант наших классов-наследников (листинг 8.2).
Листинг 8.2. Классы-наследники от TCurrency
// Рубли
class Roubles: public TCurrency { public:
friend ostream& operator<<(ostream& t, const Roubles &r);
};
ostream& operator<<(ostream& t, const Roubles &r)
{ string s = r.toStringO; return (t << s << "p."); }
// Доллары
class Bucks: public TCurrency { public:
friend ostream& operator<<(ostream& t, const Bucks &r);
*' продолжение &
Листинг 8.2 (продолжение)
ostream& operator<<(ostream& t, const Bucks &r)
{ string s = r.toStringO; return (t << s << "$"); }
// Евро
class Euros: public TCurrency { public:
friend ostream& operator<<(ostream& t, const Euros &r);
>:
ostream& operator<<(ostream& t, const Euros &r)
{ string s = r.toStringO: return (t << s << "evro"): }



Однако при трансляции тут же выясняется, что фуйкция toStringO недоступна в производных классах, так как в базовом классе она определена в приватной части. Поэтому необходимо создать в базовом классе секцию protected и перенести туда прототип функции toStringO:
class TCurrency { ^public:
typedef unsigned int uint:
TCurrency(const long double &t=0.0); // конструктор
// методы // . . .
// дружественные функции
// ... protected:
string toStringO const: private:
// . ..
};



Так как все три класса практически пока одинаковые, будем разбираться с нюансами открытого наследования, экспериментируя с рублями и модифицируя базовый класс, если это потребуется.
Опубликовал Kest November 14 2013 23:35:42 · 0 Комментариев · 4154 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Иллюстрированный ...
FormShape [Исходн...
IconCut [Исходник...
Progressbar
Delphi World 6.0
С# для профессион...
Разработка Web-пр...
Delphi 6/7 базы д...
WordReport
isoCanvas (Редакт...
FatScrollbar
DFileDeleter
CaptionButton
Конвертирование и...
Х. М. Дейтел, П. ...
Популярные загрузки
Binary2XMLDemo (Р...
MiniTetris [Исход...
Мод "проверочный ...
Создание фракталов

Топ загрузок
Приложение Клие... 100793
Delphi 7 Enterp... 98016
Converter AMR<-... 20298
GPSS World Stud... 17059
Borland C++Buil... 14238
Borland Delphi ... 10373
Turbo Pascal fo... 7390
Калькулятор [Ис... 6080
Visual Studio 2... 5228
Microsoft SQL S... 3674
Случайные статьи
Бесплатные объявления
7.4. Закон Литтла
Работа асинхронног...
Поиск на php
Настенные часы
Разработка общего ...
6.5. Дополнительна...
Базис I, K, S
Обзор панели управ...
ПАММ счета Fx-Tren...
Организация информ...
Процедура проверки...
Невозможность прин...
На рабочем столе W...
Перепелиный комбикорм
Представление внеш...
Отправка по факсу ...
Модель включения
Реализация методов
Видеоприложения со...
Процедуры и функци...
Второй этап маршру...
Переписать текст и...
Большинство програ...
SET ORDER TO TAG L...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?