У меня есть класс, подобный следующему:
public delegate void FanChangedEventHandler(Fan sender, EventArgs e);
public class Fan: BindableProperty
{
#region Blade parameters
//These Parameters apply to individual blades but are the same for each blade.
private double length;
public double Length
{
get
{
return length;
}
set
{
length = value;
NotifyPropertyChanged("Length");
OnFanChanged(EventArgs.Empty);
}
}
#endregion
#region Preliminary Fan Outputs
public double thrust
{
get
{
return GetThrust();
}
}
private double GetThrust()
{
double ThrustSum = 0;
for(int i = 0; i < Blades.count; i++)
{
ThrustSum += Blades[i].Thrust;
}
return ThrustSum;
}
#endregion
#region Final Fan Outputs
public double FinalThrust
{
get
{
return GetFinalThrust();
}
}
private double GetFinalThrust()
{
double TotalWind = 0;
for(int i = 0; i < Winds.count;i++)
{
TotalWind += Winds[i];
}
return Thrust + TotalWind;
}
#endregion
private List<Blade> blades;
public List<Blade> Blades
{
get
{
return blades;
}
set
{
blades = value;
NotifyPropertyChanged("Blades");
}
}
private List<Wind> winds;
public List<Wind> Winds
{
get
{
return winds;
}
set
{
winds = value;
NotifyPropertyChanged("Winds");
}
}
public event FanChangedEventHandler FanChanged;
protected virtual void OnFanChanged(EventArgs e)
{
try
{
UpdateProperties();
//This seems verbose, but it is important.
//http://blogs.msdn.com/csharpfaq/archive/2004/03/19/93082.aspx
FanChangedEventHandler handler = FanChanged;
if (handler != null)
handler(this, e);
}
catch (Exception ex)
{
string error = ex.Message;
}
}
public Fan()
{
Length = 21.75;
Blades = new List<Blade>();
for (int i = 0; i < 5; i++)
{
Blades.Add(new Blade(this));
Blades[i].BladeChanged += new BladeChangedEventHandler(Blade_Changed);
}
Winds = new List<Wind>();
for (int i = 0; i < 3; i++)
{
Winds.Add(new Wind());
RegisterWind(Winds[i]);
}
}
public void RegisterWind(Wind wind)
{
wind.WindChanged += new WindChangedEventHandler(Wind_Changed);
}
private void Blade_Changed(Blade sender, EventArgs e)
{
UpdateProperties();
}
private void Wind_Changed(Wind sender, EventArgs e)
{
UpdateProperties();
}
private void UpdateProperties()
{
NotifyPropertyChanged("Thrust");
NotifyPropertyChanged("FinalThrust");
}
}
Итак, если вы измените параметр длины, это вызовет событие. Это событие уведомляет все блэйды о том, что они должны обновить себя, блэйды обновляют себя, а затем уведомляют, когда они изменились, и вентилятор, в свою очередь, обновляется.
Я столкнулся с несколькими проблемами, одна из которых заключается в том, что если я изменю длину, Fan будет обновляться пять раз, когда его нужно будет обновить только один раз.
Другое: я не уверен, что FinalThrust всегда будет рассчитываться в правильном порядке. Сначала должны обновиться Лезвия, затем должна быть обновлена тяга и ветер, и после этого можно рассчитать finalThrust. (Я проверил результаты моего реального класса, и они сейчас верны, но я не знаю, может ли это привести к ошибкам в будущем)
Наконец, я хотел бы оптимизировать Fan, что означает его зацикливание. Как я могу узнать, все ли обновления завершены, чтобы я мог проверить выходные значения и выполнить следующую итерацию оптимизации?
Я задавал вопросы, прежде чем привести к этому, и ответ состоял в том, что я должен создать конечный автомат, но я не знаю, как я включил бы конечный автомат в это.
Я определенно больше инженер, чем программист! спасибо за помощь :)