У меня есть абстрактный базовый класс и несколько производных классов от этого базового класса, представляющих разные типы объектов, имеющих одинаковое свойство веса. Целью класса Selector является выбор объекта из переданной коллекции (однородных) объектов на основе некоторого алгоритма, который будет использовать вес (через API getWeight) в качестве входных данных. Количество производных классов от Base в будущем продолжит увеличиваться, да и сам алгоритм Selector также может развиваться, но входные параметры останутся неизменными.
Я отправляю производные объекты в класс Selector как указатели на базовый класс. Поскольку это преобразование, это должна быть тривиальная операция. Вызывающий Selector знает тип передаваемого объекта.
Могу ли я получить результат без необходимости использования Dynamic_cast? static_cast потенциально может использоваться, поскольку вызывающая сторона всегда знает тип объекта. Я пытаюсь выяснить, есть ли недостаток дизайна, поскольку мне нужно явное приведение типов при получении результата из класса. Мне было интересно, существует ли шаблон проектирования, который поможет мне избежать явного случая.
Я стараюсь избегать использования шаблонов, поскольку в прошлом это приводило к проблемам со временем разработки. Тем не менее, я готов использовать его, если это лучше подходит для такого рода использования.
class Base {
virtual int getWeight() = 0;
};
class DerivedA : public Base {
public:
int getWeight() { return _weight; }
private:
int _weight = 0;
string _name;
};
class DerivedB : public Base {
public:
int getWeight() { return _weight; }
private:
int _weight = 0;
float _multiplier = 1;
};
// Calls the getWeight function of each object and selects on of the object based on some algorithm (e.g. max)
class Selector {
public:
Selector(vector);
Base* getResult();
};
void CallingFunctionA(vector v) {
vector basePointers = getBasePointerVec(v);
Selector s(basePointers);
// Can a dynamic_cast be avoided?
DerivedA* result = dynamic_cast s->getResult();
}
void CallingFunctionB(vector v) {
vector basePointers = getBasePointerVec(v);
Selector s(basePointers);
// Can a dynamic_cast be avoided?
DerivedB* result = dynamic_cast s->getResult();
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... rking-on-a
Лучший способ передать обратно результат указателя производного класса из класса, работающего с набором указателей базов ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение