Навигация
Главная
Поиск
Форум
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
Реклама
Сейчас на сайте
Гостей: 8
На сайте нет зарегистрированных пользователей

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

Лабораторная работа по динамическим спискам на Turbo Pascal (перемещение...
Метод половинного деления для нахождения корня уровнения на Turbo Pascal...
Моделирование регулировочного участка цеха на GPSS + Пояснительная записка

Использование RTTI
Покажем несколько схем реализации мультиметодов. Обычно классы, которые участвуют в работе мультиметодов, являются «родственниками», однако в некоторых случаях возможна реализация и между неродственными классами. Пусть у нас есть базовый абстрактный класс Base и три наследника: Deri ved_a, Deri ved_b и Derived_c. Нам требуется выполнять некую операцию со всеми возможными сочетаниями параметров. В базовом классе определяется чистый абстрактный метод, который реализуется в производных классах.
В общем случае для трех типов, А, В и С, число сочетаний любых двух типов равно девяти:

1. Derived_ a — Den ved_ a.
2. Derived_ a — Deri ved_ _b.
3. Derived_ a — Den ved_ _c.
4. Derived_ _b — Den i ved_ a.
5. Derived_ _b — Den ved_ _b.
6. Derived_ _b — Den ved_ _c.
7. Derived_ с — Den ' ved_ a.
8. Derived_ _c — Den ved_ _b.
9. Derived с — Derived c.




В конкретных ситуациях сочетаний бывает меньше, так как операция может оказаться коммутативной для некоторых сочетаний. Например, операция умножения скаляра и вектора — коммутативна, так же как и операция умножения скаляра на матрицу. Метод, выполняющий двойное переключение по типу, реализуется с параметрами базового класса — используется принцип подстановки. Двойное переключение эмулируется при помощи цепочек if...else с использованием преобразования dymami c_cast<>. Покажем сначала реализацию для двух классов (листинг-10.8), а потом добавим третий.

Листинг 10.8. Двойной диспетчер для двух типов
// требуемая операция
// определение деструктора
продолжение &
// определения классов class Base { public: virtual ~Base()=0;
virtual bool Operator(const Base &R) = 0;
};
Base::~Base(){} class Derived_a: public Base




Листинг 10.8 {продолжение) { public:
virtual bool Operator(const Base &R);
};
class Derived__b: public Base { public:
virtual bool Operator(const Base &R);
};
// реализация методов двойной диспетчеризации bool Derived_a::0perator(const Base &R)
{ if (const Derived_a *pra = dynamic_cast<const Derived_a*>(&R)) { // правый аргумент типа А; обработка варианта "А-А" cout << "А-А" << endl; return true;
}
else if (const Derived_b *prb = dynamic_cast<const Derived__b*>(&R)) { // правый аргумент типа В; обработка варианта "А-В"
cout << "А-В" << endl;
return true;
>
else throw exception ("Error! Incorrect type argument!");
}
bool Derived_b::0perator(const Base &R)
{ if (const Derived__a *pra = dynamic_cast<const Derived_a*>(&R)) { // правый аргумент типа А; обработка варианта "В-А" cout << "В-А" << endl; return true;
}
else if (const Derived_b *prb = dynamic_cast<const Derived_b*>(&R)) { // правый аргумент типа В; обработка варианта "В-В"
cout << "В-В" << endl;
return true;
}
else throw exception ("Error! Incorrect type argument!");
}




Мультиметоды устроены достаточно просто: проверяется правый операнд, и в зависимости от его типа выполняется обработка. Если же правый операнд неизвестного типа, то генерируется исключение. Добавим третий класс и покажем механизм использования оператора typeidO для распознавания типа (листинг 10.9).
Опубликовал Kest December 04 2013 17:03:55 · 0 Комментариев · 2861 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Программирование ...
Delphi 2005 Секре...
DAlarm
Мод "проверочный ...
Заставка. Изображ...
Trojan [Исходник ...
Программирование ...
Применение фильтр...
PDJPack
Последние загруж...
База англоязычных...
FilesInfo
Пример работы с р...
Развивающийся фла...
KOL & MCK v1.69
Zoom [Исходник на...
«Философия» прогр...
WAP версия сайта
Приемы программир...
Добавление к ссы...

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97836
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14191
Borland Delphi ... 10291
Turbo Pascal fo... 7374
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
кол источника исто...
Узел ограничения д...
Аргументы переменн...
Фотокниги
Реализация контейн...
ТОП лучших игровых...
memory_object_data...
Рабочий стол, меню...
Виртуальная телефо...
УСТРОЙСТВА В GPSS
Всегда можно измен...
Игровые автоматы....
Невозможность созд...
Основные понятия
В океане Интернета...
ИЗУЧЕНИЕ ПРОГРАММН...
Вычисление конечны...
Официальный игрово...
Ввод строк
Область диаграммы
Нерекурсивное пост...
«Бегун» про контек...
Если хотя бы одно ...
Представление дере...
Резервное копирова...
Статистика



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


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