Event in abgeleiteter Klasse aufrufen



  • Hi Leute,

    ich hab ein Problem mit events:
    Ich habe eine Klasse abstrakte Klasse A in der ein Event definiert wird. Jetzt will ich in den Funktionen der abgeleiteten Klassen dieses Event aufrufen. Leider geht das nciht! (error CS0070: The event namespace.A.ActionProgress' can only appear on the left hand side of += or -= (except when used from within the type 'namespace.A)
    Wie kann ich das Ändern? Für jede abgeleitete Klasse wieder das Event neu zu definieren ist ja wohl Schwachsinn (Redundanz ohne Ende)



  • Post mal bissle Code, du verwendest es hier im Moment glaube ich nur falsch. Darauf deutet die Fehlermeldung jedenfalls hin.



  • Ich denke nicht, dass ich es falsch verwende (oder die Implementation ist nicht intuitiv). Hier der Code:

    public delegate void ActionProgressEvent(object o);
        public abstract class A
        {
            public event ActionProgressEvent ActionProgress;
        };
        public class B : A
        {
            void func(string s)
            {
                if(this.ActionProgress != null)
                    this.ActionProgress((object)s);
            }
        };
    


  • hi,du musst den delegate ActionPressEvent eine Methode zuordenen, Bsp:

    ActionProgress = new ActionProgressEvent(test);
    this.ActionPress((object)s);
    

    //und dann kannst du die Methode aufrufen

    wobei test hier eine methode ist die void zurückliefert und ein Object als Parameter erwartet.(Denn so hast du ja dein Delegate definiert)
    d.h du musst noch irgendwo eine methode haben die so aussieht:

    public void test(Object s){
     //do something ...
    }
    

    lg rizi



  • hi,sorry ich kann den obigen beitrag leider nicht editieren deswegen,mache ich es hiermit:
    es gehört statt:
    ActionProgress = new ActionProgressEvent(test);

    folgendes:
    ActionProgress += new ActionProgressEvent(test);

    += deswegen weil du dein ActionProgress mit dem schlüsselwort event versehen hast, somit kann es nur in der definierten klasse mit = new ActionProgressEvent(test) erzeugt werden um sicherzustellen,dass jemand der eine weitere mehtode zum Delegate hinzufügt nicht unabsichtlich alle überschreibt!!
    ps. die methode muss natürlich nicht test heißen,kann ein beliebiger name sein, nur die signatur muss mit dem des Delegates übereinstimmen!

    lg rizi



  • Hi,

    das mache ich natürlich. Das Problem muss wo anders liegen.

    public void func()
    {
        B b = new B();
        b.ActionProgress += test;
    }
    
    public void test(object o)
    {
        MessageBox.Show((string)o);
    }
    


  • dEUs schrieb:

    Jetzt will ich in den Funktionen der abgeleiteten Klassen dieses Event aufrufen.

    Auslösen in abgeleiteten Klassen geht nicht. Der Auslöser ist sozusagen private. Du kannst aber eine protected Methode anbieten, die das macht.



  • grml...
    Danke.


Anmelden zum Antworten