Я столкнулся с небольшой проблемой дизайна моего кода.
У меня есть объект, который создает дочерний объект (потом ребенок может создать другого дочернего объекта и т. Д.), И оба объекта подписываются на одно и то же событие.
Но я хочу, чтобы событие получал только самый дочерний объект.
Обзор моего проекта:
Я создаю систему IVR. Когда пользователь звонит в систему, у него будет выбор из X меню. В зависимости от того, что выберет пользователь, у него будет подменю выбора, и так далее, и так далее. Я использую государственные машины для этого. Каждый конечный автомат должен «слушать», когда пользователь нажимает номер на своем телефоне. Но только текущий конечный автомат должен обработать введенный номер. Каждый конечный автомат может создать новый конечный автомат для представления подменю.
Вот пример кода:
Базовый класс:
public delegate void DoSomething(object sender, EventArgs data);
public class Base
{
public event DoSomething myEvent;
private IObject foo;
public Base ()
{
foo = new myObjectA(this);
}
public void SomeAction()
{
((myObjectA)foo).CreateChild();
}
public void EventFired()
{
if (myEvent != null)
{
myEvent(this, new EventArgs());
}
}
}
Objecta:
class myObjectA : IObject
{
private Base theCallingObject;
private IObject child;
public myObjectA (Base _base)
{
theCallingObject = _base;
theCallingObject.myEvent += new DoSomething(theCallingObject_myEvent);
}
public void CreateChild()
{
child = new myObjectB(theCallingObject);
}
void theCallingObject_myEvent(object sender, EventArgs data)
{
// Handle event
MessageBox.Show("myObjectA");
}
}
ObjectB:
class myObjectB : IObject
{
private Base theCallingObject;
public myObjectB (Base _base)
{
theCallingObject = _base;
theCallingObject.myEvent += new DoSomething(theCallingObject_myEvent);
}
void theCallingObject_myEvent(object sender, EventArgs data)
{
// Handle event
MessageBox.Show("myObjectB");
}
}
Теперь, когда я делаю это:
Base blah = new Base();
blah.SomeAction();
blah.EventFired();
Я получаю окна сообщений для A и B.
Мне нужно реализовать Base так, чтобы только myObjectB получал событие.
У меня будут сотни myObject, поэтому мне нужна реализация на базовом уровне, а не на уровне myObject. Кроме того, обработка этого уровня на уровне myObject по-прежнему требует запуска события, вызывающего проблемы с производительностью, если существуют сотни объектов.
Одно из решений, которое я рассмотрел, - это когда myObjectA создает дочернего элемента, отписывается от события, а затем повторно подписывается, когда мы возвращаемся к уровню myObjectA. Однако я чувствую, что можно сделать что-то лучшее.
У кого-нибудь есть идеи?
Редактировать: Используя данные Payo, я придумал следующее:
public delegate void DoSomething(object sender, EventArgs data);
public class Base
{
private IObject foo;
private List<DoSomething> _myEventStorage;
public event DoSomething myEvent
{
add
{
_myEventStorage.Insert(0, value);
}
remove
{
_myEventStorage.Remove(value);
}
}
public Base ()
{
_myEventStorage = new List<DoSomething>();
foo = new myObjectA(this);
}
public void SomeAction()
{
((myObjectA)foo).CreateChild();
}
public void EventFired()
{
_myEventStorage[0].Invoke(this, new EventArgs());
}
}