Laden...

Zählerklasse Counter richtig implementiert?

Erstellt von serial vor 16 Jahren Letzter Beitrag vor 16 Jahren 952 Views
S
serial Themenstarter:in
902 Beiträge seit 2007
vor 16 Jahren
Zählerklasse Counter richtig implementiert?

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?

Gelöschter Account
vor 16 Jahren

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

S
8.746 Beiträge seit 2005
vor 16 Jahren

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:

  1. Prüfungsdelegate im Konstruktor übergeben (damit ist der fix) oder
  2. Als (write only) Property anbieten
  3. der Add-Methode als 2. Parameter übergeben