наследование обработки событий (C ++) - PullRequest
0 голосов
/ 01 июня 2011

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

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

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 01 июня 2011

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...