Это отличное место, чтобы использовать что-то вроде шаблона Strategy .
Вместо изменения базового класса на Camera
, пусть Camera
содержит указатель либо на Sensor1
, либо на Sensor2
.Вот где вы проверяете свое состояние.
Если два класса Sensor1
и Sensor2
наследуются от общей базы (например, Sensor
), шаблон очень прост в реализации.
Мой C ++ немного заржавел, поэтому воспринимайте это как код или псевдокод, в зависимости от того, насколько он действителен:
class Camera {
private:
Sensor* obj;
public:
Camera (bool flag){
if (flag) {
obj = new Sensor1();
} else {
obj = new Sensor2();
}
}
}
Вы также можете предоставить функции (одну для Sensor1
и одну для * 1020).*) для приведения поля obj
к правильному типу.
Об изменении базового класса
Давайте поговорим о , почему это невозможнопереключить базовый класс и почему он был бы нецелесообразен, даже если бы вы могли.
Думайте о своем классе как о обычной структуре, содержащей поля, плюс ряд функций, работающих с переменной этого типа структуры с именем this
.
Если вы наследуете от Sensor1
, структура для Camera
будет содержать все поля из Sensor1
и все поля из Camera
.Ради аргумента, скажем, все это добавляет до 42 байтов памяти.И скажем, объединение полей из Sensor2
с полями из Camera
добавляет до 60 байт.
Очевидно, что если вы затем динамически измените базовый тип, ваш объем памяти должен измениться, но распределение былоуже сделано, когда вы входите в конструктор.Таким образом, если бы вы могли переключать базовые типы с Sensor1
на Sensor2
в то время, у вас вдруг было бы слишком мало 18 байт, и обновление любого из них привело бы к перезаписи памяти, которая, возможно, была бы выделена для чего-то другого.Это катастрофа в ожидании.
И поэтому мы используем такие шаблоны, как Стратегия , как я показал здесь.Проще рассуждать, легко реализовать, широко понять и безопасно.