Я работаю над небольшим проектом Unity с С#.
У меня есть класс UnitManager
, который содержит список экземпляров класса Unit
. Я хочу вызвать событие всякий раз, когда свойство (например, здоровье) изменяется в экземпляре Unit
. Я также использую UnitManager
для хранения обработчиков событий. Например, у меня есть менеджер пользовательского интерфейса, который подписывается на событие в файле UnitManager
.
У меня проблема в том, что я не хочу, чтобы класс Unit
знал о классе UnitManager
. Код, который у меня есть сейчас (ниже), работает, но я думаю, что это будет считаться связанным кодом?
public class Unit
{
private int health;
public int Health {
get { return health; }
set
{
health = value;
UnitManager.Instance.OnHealthChanged(this); //Unit shouldn't call UnitManager, right?
}
}
}
public class UnitManager
{
protected List<Unit> units = new List<Unit>();
public delegate void UnitHealthChangedEventHandler(object source, UnitEventArgs args);
public event UnitHealthChangedEventHandler HealthChanged;
public virtual void OnHealthChanged(Unit _unit)
{
if (HealthChanged != null)
{
HealthChanged(this, new UnitEventArgs() { unit = _unit });
}
}
}
public class UIManager
{
void Start()
{
UnitManager.Instance.HealthChanged += OnUnitHealthChanged;
}
}
Согласно MSDN sample, обработчики событий должны храниться В Unit
(отправителе события). Разница в том, что образец на MSDN имеет только один экземпляр «Счетчик», а мой код имеет несколько экземпляров. Это означало бы, что я должен перебрать все экземпляры Unit, а затем подписаться на все из них. Боюсь, это станет проблемой производительности. (Тем более, что у меня такая же проблема в нескольких местах в моем коде)
Подводя итог моему вопросу: как лучше всего (с точки зрения ООП/слабой связи) позволить обработчику событий обрабатывать события, возникающие в нескольких экземплярах класса?