Laden...

Problem mit Templateklasse und Events

Erstellt von AlfameisterT vor 18 Jahren Letzter Beitrag vor 18 Jahren 3.018 Views
A
AlfameisterT Themenstarter:in
154 Beiträge seit 2005
vor 18 Jahren
Problem mit Templateklasse und Events

Hallo,

ich stehe vor einem kleinen Problem.
Sobald die Basisklasse ein Template ist, kann ich von der abgeleiteten nicht mehr auf die Members vom Typ Event zugreifen.

Das Ereignis "BaseClass<string>.Event1" kann nur links von += oder -= stehen (es sei denn, es wird innerhalb des Typs "BaseClass<T>" verwendet)



    public delegate void del();

    public abstract class BaseClass<T>
    {
        T member;
        
        public event del Event1;

        public BaseClass(){}
    }



    public class Class1 : BaseClass<string>
    {
        public Class1(){}

        public void DoSomething()
        {
            if (this.Event1 != null)
            {
                  //Fehler bei diesem Zugriff auf Event1
            }

        }
    }

Warum ist das so?

.

347 Beiträge seit 2006
vor 18 Jahren

Du hast da einen Event deklariert und du bist hier in eine klassische Compiler magic Falle gerannt. 😁

Wenn du das hier schreibst:

public event DelegateTyp MyEvent;

wird eigentlich das hier daraus:

DelegateTyp myEvent;

public DelegateTyp MyEvent
{
   add   { myEvent += value; }
   remove{ myEvent -= value; }
}

Innerhalb der Klasse wird der Compiler das private Feld des Delegaten benutzen.
Deshalb geht dort das hier:

if(MyEvent != null)
  blabla;

Eigentlich wird das hier kompostiert:

if(myEvent != null)
  blabla;

Der öffentliche Event hat, wie für Events üblich nur add und remove als Accessors.[1]
Deshalb kannst du in der Ableitung oder in anderen Typen nur noch Delegaten hinzufügen oder entfernen.

Es gibt 2 Lösungen für dein Problem, eine ist das übliche Event pattern in .Net, die andere ist ein übler Hack-around. 😉
*

public event DelegateTyp MyEvent;
protected virtual OnMyEvent(SomeEventargsDescendant eventArguments)
{
  if(MyEvent != null)
    MyEvent(this, eventArguments);
}
protected DelegateTyp myEvent;

public DelegateTyp MyEvent
{
   add      { myEvent += value; }
   remove{ myEvent -= value; }
}

Die 2. Lösung gibt dir in Ableitungen direkten Zugriff auf den Delegaten, die erste lässt dich in Ableitungen nur den Deleagten feuern ohne direkten Zugriff zu gewähren.
In 99.9P% aller Fälle sollte die 2. Lösung als "pfui deivel" eingestuft werden. 😉

[1]Events sind neben Properties Abstraktionen von Feldern.
Properties haben get_PropertyName/set_PropertyName, Events haben add_EventName/remove_EventName.

Edit1&2: noch mehr Copy&Waste Fehlerchen... 8o