Hallo,
ich schonwieder =(
Habe folgende Aufgabe bekommen, und ich weiss nicht wie ,ich das "richtig" lösen kann:
Aufgabe:
"Implementieren Sie eine Zählerklasse Counter mit einer Methode Add(X) zum Eröhen des Zählerwertes und einer Methode Clear() zum Löschen des Zählerwertes. Wenn der Zählerwert eine bestimmte Bedingung erfüllt (z.B Zählerwert > 1000) sollen eine oder mehrere Aktionen ausgelöst werden. Sowohl die Bedingung als auch die Aktionen sollen als Delegates an die Zählerklasse übergeben werden können!"
Also die Aktionen die passieren sind ja kein Problem, aber die Bedingung als Delegate??
Ich hab das so "gelöst"
Class Counter
namespace Trigger
{
delegate bool EventOkhandler(int x);
delegate void RaiseEventHandler(int x);
class Counter
{
public event RaiseEventHandler RaiseEvent;
public event EventOkhandler SubmitOk;
private int m_summ;
public void Add(int x)
{
m_summ += x;
if (SubmitOk != null)
{
Console.WriteLine("Submit loaded");
Console.WriteLine(m_summ);
if (SubmitOk(m_summ))
{
Console.WriteLine("Submit fired");
if (RaiseEvent != null)
RaiseEvent(x);
else
Console.WriteLine("Kein RaiseEvent");
}
}
else
Console.WriteLine("Kein SubmitEvent");
}
}
}
Die Klasse Tester, welche die Aktionen (Test1 und Test2 sowie die "Bedingung" enthält
namespace Trigger
{
class Tester
{
public bool TestValue(int x)
{
Console.WriteLine("in Testvalue mit wert: {0}", x);
if (x == 10)
{
Console.WriteLine("Zustand ereicht");
return true;
}
return false;
}
public void Test1(int x)
{
Console.WriteLine("Ereigniss ausgelöst bei {0}", x);
}
public void Test2(int x)
{
Console.WriteLine("Ergeigniss auch ausgelöst");
}
}
}
Die Implementierung zum testen
static void Main(string[] args)
{
Tester t = new Tester();
Counter c = new Counter();
c.SubmitOk += new EventOkhandler(t.TestValue);
c.RaiseEvent += new RaiseEventHandler(t.Test1);
c.RaiseEvent += new RaiseEventHandler(t.Test2);
c.Add(2);
c.Add(5);
c.Add(3);
Console.ReadLine();
}
so, also es funktioniert erstmal, nur möchte ich wissen, ist das damit gemeint?
Oder wie kann oder sollte man diese Bedingung besser übergeben?
hi
ich versthe nicht warum du das postet, ist doch OK
ich hätte es kaum anders realisiert
eine sache hätte ich anders gemacht, bei
SubmitOk(m_summ)
solltest du darauf achten, dass es ein SingleCastDelegat ist
z.B. so:
bool xx = false;
foreach(EventOkhandler evnt in SubmitOk.GetInvocationList) xx=(evnt())?true:xx;
if (xx)
{
Console.WriteLine("Submit fired");
if (RaiseEvent != null)
RaiseEvent(x);
else
Console.WriteLine("Kein RaiseEvent");
}
MfG janismac
Prinzipiell ist das alles schon ganz gut.
Allerdings solltest du Bedingung nicht als Event anbieten, es sei denn, du willst damit eine Bedingungskette aufbauen (was allerdings noch zusätuzlichen Code erfordert um die einzelnen Delegaten einzeln aufzurufen und die Ergebnis logisch zu verknüpfen). Dein momentanter Code erlaubt es zwar, mehrere Bedingungen anzugeben (fordert die Aufgabestellung sowieso nicht), aber nur die letzte entscheidet.
Daher: