У меня есть абстрактный класс Parent, который имеет несколько дочерних элементов и пустые функции для взаимодействия с каждым из этих дочерних элементов. Каждый Дочерний элемент переопределяет функции Родителя и по-разному взаимодействует с другими Дочерними элементами; т. е. Child1 имеет разные реализации для взаимодействия с (Child1), взаимодействия с (Child2) и т. д. и т. д.
В Parent у меня есть функция interface_with(Parent foo). Каждый ребенок, желающий взаимодействовать с другим ребенком, должен сначала пройти через эту функцию. До сих пор все было хорошо, но затем мы сталкиваемся с проблемой: после обработки некоторой базовой логики дочернему элементу необходимо знать конкретный тип своего параметра, чтобы он мог продолжить и вызвать свою собственную переопределенную функцию. На данный момент у меня есть это:
Child1* child1 = dynamic_cast<Child1*>(foo);
Child2* child2 = dynamic_cast<Child2*>(foo);
Child3* child3 = dynamic_cast<Child3*>(foo);
if(child1 != nullptr){
interact_with(child1)
}
else if(child2 != nullptr){
interact_with(child2)
}
else if(child3 != nullptr){
interact_with(child3)
}
Это работает, но это не очень хорошее решение. Особенно плохо становится, когда у меня так много занятий. Указывает ли это на несовершенство базовой конструкции, и если да, то как я могу это исправить?
РЕДАКТИРОВАТЬ: Чтобы уточнить: у меня есть что-то вроде этого
//Parent is an abstract class
class Parent
{
void interact_with(Parent* foo){
//this is here because there is a lengthy code segment
//that needs to be run no matter what child interacts
//with which
//afterwards, I need to interact with whatever foo really is
}
virtual void interact_with(Child1* child){*blank*};
virtual void interact_with(Child2* child){*blank*};
virtual void interact_with(Child3) child){*blank*};
};
class Child1 : public Parent
{
virtual void interact_with(Child1* child){*do something*};
virtual void interact_with(Child2* child){*do something else*};
virtual void interact_with(Child3* child){*do something else*};
};
Уже.