Шаг 4 - О двойной диспетчеризации.
Шаг 4 - О двойной диспетчеризации.
Предположим, у нас есть массив, в котором мы храним карту местности. Разумеется, что элементы массива разнообразные - дома, колодцы, казино… ничего общего. Кроме суперкласса - предка естественно.
CBuilding
¦
______¦_______
¦ ¦ ¦
CHouse CWell CCasino
А карту эту мы отражаем разными способами. И даже не то, что разными способами, а имеем для такой благой цели несколько видов карт. Ну я не знаю, не картограф. Черви и пики. Нет, ладно. Радиоактивность и карма.
CMap
|
____________
| |
CRadioMap CCarmaMap
И что получается? Кто будет себя отрисовывать? И кто кого? Для каждой комбинации наследников CBuilding и CMap свой уникальный алгоритм. Что делать то будем? Какие феерические решения приходят… нет… не вам! Вашему коллеге или начальнику или подчиненному в голову? Да они ни сном ни духом о двойной диспетчеризации! Они скорее всего предложат получить информацию о типе во время исполнения, и запузырить в Ваш прекрасный проект кривоногий switch (){}. Да еще и положить в каждый класс статический член с информацией о типе… Одно звучание предыдущей фразы наводит на подозрения. Но что делаем мы? вот что:
class CBuilding: {
public:
virtual void doDraw(CMap* map)=0;
}
class CHouse: public CBuilding {
public:
virtual void doDraw (CMap* map) {
// ВОТ ОНА САМАЯ КОРКА!
map-›doDraw(*this);
}
};
// Эти такие же.
class CWell: public CBuilding {
public:
virtual void doDraw (CMap* map) {map-›doDraw(*this);}
};
class CCasino: public CBuilding {
public:
virtual void doDraw (CMap* map) {map-›doDraw(*this);}
};
// Это абстрактный класс для карт.
class CMap {
public:
virtual void doDraw (CHouse& cb)=0;
virtual void doDraw (CWell& cb)=0;
virtual void doDraw (CCasino& cb)=0;
};
Это конечно не все. Теперь нужно наследовать CRadioMap и CcarmaMap от общего предка CMap и в каждом классе рисовать реализацию алгоритма. За отрисовку отвечает карта, но какая масть - решает виртуальная CBuilding::doDraw(), а какое строение - выбирается перегруженная CMap::doDraw().
Одинаковое имя для функций отрисовки в разных классах давать не обязательно, но это является хорошим тоном при двойной диспетчеризации, и плохим без нее.
Круто? Это - подвиг неизвестного программиста. У Элджера был разобран пример со сложением чисел, очень красивый, но не сразу понятный. Там числа происходят от одного предка, что левый, что правый операнд оператора +, и по моему, обе диспетчеризации происходят по механизму виртуальных функций. Увы, мне лень набирать код.
Код к данному шагу я не проверял, в отличие от предыдущих. К диспетчеризации мы еще вернемся. Или не вернемся. Но следующий шаг однозначно про указатели.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Дисциплина диспетчеризации
Дисциплина диспетчеризации Для дочернего потока может потребоваться установить иную по отношению к родителю дисциплину (политику) диспетчеризации (SCHED_FIFO, SCHED_RR, SCHED_SPORADIC):pthread_attr_t attr;pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);pthread_attr_setinheritsched(&attr,
Очередь диспетчеризации задач
Очередь диспетчеризации задач TDE всех задач, которые могут выполняться на процессоре в любой данный момент времени, объединены в структуру данных, называемую очередью диспетчеризации задач TDQ (task dispatching queue). TDQ реализована как связный список в памяти, в котором TDE
8.1.2 Параметры диспетчеризации
8.1.2 Параметры диспетчеризации В каждой записи таблицы процессов есть поле приоритета, используемое планировщиком процессов. Приоритет процесса в режиме задачи зависит от того, как этот процесс перед этим использовал ресурсы ЦП. Можно выделить два класса приоритетов
8.1.3 Примеры диспетчеризации процессов
8.1.3 Примеры диспетчеризации процессов На Рисунке 8.4 показана динамика изменений приоритетов процессов A, B и C в версии V при следующих допущениях: все эти процессы были созданы с первоначальным приоритетом 60, который является наивысшим приоритетом выполнения в режиме
1.7. Системы с двойной загрузкой
1.7. Системы с двойной загрузкой Прежде чем устанавливать на своем компьютере вторую операционную систему, обязательно сделайте резервное копирование важных данных, потому что процесс установки операционной системы включает в себя переразбиение жесткого диска на
Dual Tint (Двойной оттенок)
Dual Tint (Двойной оттенок) Позволяет окрасить изображение в два выбранных оттенка цвета, при этом градиентно смешивая их (рис. 4.12). Рис. 4.12. Исходное изображение (слева) и пример использования фильтра Dual Tint (Двойной оттенок) (справа) – цветовая гамма
R.4.3 Значения с плавающей точкой и двойной точностью
R.4.3 Значения с плавающей точкой и двойной точностью Для выражений типа float может использоваться арифметика с обычной точностью. Если значение с плавающей точкой меньшей точности преобразуется в значение типа float равной или большей точности, то изменения значения не
1+1=? Можно ли получить двойной выгрыш от двойной вид
1+1=? Можно ли получить двойной выгрыш от двойной вид Автор: Сергеев АлександрnVidia анонсировала свой топовый продукт GeFeorce 9800 GX2, которому вменяется в обязанности переплюнуть самую мощную до недавнего времени модель Radeon 3870 X2 и стать очередным самым быстрым продуктом
Двойной удар первой ласточки
Двойной удар первой ласточки Автор: Алексей Стародымов+возможность работы с двумя SIM-картами, последняя версия программного интерфейса, качественная камера-слишком толстый, высокая цена, наличие в системе лишь одного модемаМногим из нас приходилось и приходится