2011-06-01 4 views
0

Я пересматриваю, как обрабатываются события (связанные с данными) для существующего кода (на C++). К событиям, которые необходимо обработать, относятся связанные события DataTable, а также связанные события XmlNode.наследование обработки событий (C++)

Я хочу создать общий суперкласс с виртуальными функциями (называя его EventManager), чтобы обеспечить согласованность между приложениями.

я планирую иметь следующие виртуальные функции в EventManager:

DataChanged(EventArgs arg) 
DataChanging(EventArgs arg) 
DataInserted(EventArgs arg) 
DataInserting(EventArgs arg) 
DataRemoved(EventArgs arg) 
DataRemoving(EventArgs arg) 

Я использовал EventArgs в качестве параметра, так как другие (XmlNodeChangeEventArgs, DataRowChangeEventArgs, DataColumnChangeEventArgs) являются производными от него. Но, используя его в виртуальных функциях, я потеряю информацию, уникальную для производных аргументов событий.

Мой вопрос: как я должен проектировать/обрабатывать этот суперкласс и виртуальные функции, чтобы иметь общий класс, который управляет событиями, но все же может правильно сопоставить (со всей необходимой информацией) производные классы?

Я сделал все возможное, чтобы объяснить свою ситуацию, но, пожалуйста, не стесняйтесь задавать вопросы, чтобы уточнить вопрос. Я действительно ищу хорошо продуманные ответы, поэтому я открыт для улучшения моего вопроса!

Заранее благодарим за ваше время и терпение! :)

+0

Используйте ссылку или константу, если требуется, вместо копирования. – DumbCoder

ответ

1
  1. Передайте аргументы reference, проходя по значению только добавляет дополнительные накладные расходы.

  2. Но, используя его в виртуальных функциях, я потеряю информацию, уникальную для производных событий args.

Вы можете использовать dynamic_cast и проверить правильность смиренных, никакая информация не будет потеряна.

1

Помимо передачи всех ваших событий по ссылке, а не по значению (что бы их обрезать, чтобы вы не могли их отбросить), я бы подумал об определении более абстрактного способа просмотра ваших событий, чтобы передача ссылки на базовый класс не помешает вам получить доступ ко всем функциям, определенным в производных классах.

Я не знаю, возможно ли это, но вы можете сделать свой класс EventArgs виртуальным базовым классом, предоставляя интерфейс, достаточно общий для размещения всего, что вам может понадобиться в производных классах.

Если вы укажете больше информации о действиях и поведении, которые вы планируете для своих событий, я могу попытаться предоставить более подробные предложения.

+0

ну, самая большая причина изменений, которые я делаю («общая»), для отмены/повтора в приложении. В настоящее время команда отмены/повтора обрабатывает только события XmlNode, но для этого требуется обрабатывать все типы событий данных (следовательно, подход наследования). Undo/redo должен знать, очевидно, исходные и текущие значения данных. Отвечает ли ваш вопрос на ваш вопрос? – developer

Смежные вопросы