Я реализовал фреймворк отмены / повтора и получил набор командных классов, которые поддерживают изменение различных атрибутов класса символов.Существует несколько 10+ производных классов, каждый из которых практически одинаков, за исключением определенного атрибута класса символов, с которым он работает.
Я бы хотел вставить этот код резака печенья в базовый класс и каким-то образом получить производный класс, с которым он может работать.Возможно ли это?
Обратите внимание, что некоторые из атрибутов являются bools, а некоторые - двойными
class character
{
public:
double attribute1;
double attribute2;
double attribute3;
double attribute4;
//etc
bool boolattribute1;
bool boolattribute2;
//etc
};
class CharacterCommand { }
class CharacterCommandAttribute1 : public CharacterCommand { }
class CharacterCommandAttribute2 : public CharacterCommand { }
class CharacterCommandAttribute3 : public CharacterCommand { }
class CharacterCommandAttribute4 : public CharacterCommand { }
void CharacterCommandAttribute1::redo()
{
std::vector<character*> chars = this->textbox->getSelectedCharacters(...);
for(size_t c=0;c<chars.size();++c)
{
character * ch = chars[c];
ch->attribute1 = this->doValue;
}
}
void CharacterCommandAttribute1::undo()
{
std::vector<character*> chars = this->textbox->getSelectedCharacters(...);
for(size_t c=0;c<chars.size();++c)
{
if(c < this->undoValues.size())
{
character * ch = chars[c];
ch->attribute1 = this->undoValues[c];
}
}
}
void CharacterCommandAttribute2::redo()
{
std::vector<character*> chars = this->textbox->getSelectedCharacters(...);
for(size_t c=0;c<chars.size();++c)
{
character * ch = chars[c];
ch->attribute2 = this->doValue;
}
}
void CharacterCommandAttribute2::undo()
{
std::vector<character*> chars = this->textbox->getSelectedCharacters(...);
for(size_t c=0;c<chars.size();++c)
{
if(c < this->undoValues.size())
{
character * ch = chars[c];
ch->attribute2 = this->undoValues[c];
}
}
}
Редактировать Для пояснения: каждый из определенных классов команд является производным от базового классаи предоставляют переопределения для чисто виртуальных функций отмены и возврата.Эти конкретные классы хранятся в QUndoStack, который вызывает виртуальное повторение или отмену команды в зависимости от ситуации.
Каждая конкретная команда отвечает за функциональность настройки одного атрибута пользовательского интерфейса для набора «символов» (текущий выбор).Специальная команда сохраняет существующее состояние атрибута каждого символа в векторе и использует их для предоставления состояния отмены.
Все работает нормально;Я просто чувствую, что слишком много копирующих и вставляющих повторяющихся кодов, с единственной значительной разницей, это
ch-> attribute2 = this-> doValue;(см. выше: redo)
и
ch-> attribute2 = this-> undoValues [c];(см. выше: отменить)
Имейте в виду, что векторные типы attribute2, doValue и undoValues одинаковы в данном производном классе, но различаются в наборе производных классов.Это та деталь, которая мешает мне перенести почти все в базовый класс.