Сегодня я столкнулся с вопросом , найденным здесь , который поставил этот вопрос передо мной.
Вот псевдокодовый пример того, что я получаю на:
class Car{
public:
virtual int goFast() = 0;
};
class FordFocus : public Car {
public:
int goFast(){
return 35;
};
};
class Lamborghini : public Car {
bool roof;
public:
int goFast(){
return -1/0; // crash
};
void retractTheRoof(){
roof = 0;
};
};
class RichGuy {
vector cars;
public:
void goDrive() {
for(int i = 0; i < cars.size(); ++i) {
if(Lamborghini* lambo = dynamic_cast(cars[i])) {
lambo->retractTheRoof();
};
goFast();
};
};
};
В примере есть RichGuy
класс. Richguy
отслеживает только свои Cars
в одном векторе. Поскольку у него так много Машин
, было бы слишком сложно отслеживать их, основываясь на том, являются ли они FordFocus
или Lamborghini
. Однако, единственный тип автомобиля с выдвигающейся крышей - это Lambo. Для того, чтобы убрать TheRoof()
, RichGuy
теперь должен определить, действительно ли Car
, который у него есть, является Lamboghini
, а затем опустить, чтобы выполнить эту функцию этого автомобиля.
Основываясь на этом примере, был ли выбор в пользу понижения в хорошей конструкции? Или он нарушил цель полиморфизма, предполагая, что цель состоит в том, чтобы позволить производным классам определить свое собственное поведение, и обеспечить общий интерфейс для таких классов, как RichGuy
? И если да, то есть ли лучший способ разрешить использование функций типа retractTheRoof()
(или, по крайней мере, их эффект) в RichGuy
?