Announcement

Collapse
No announcement yet.

Vererbung von Ereignissen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Vererbung von Ereignissen

    Im Buch "Visual C# 2012" schreibt der Autor, dass Ereignisse nicht vererbt werden können.
    "5.2.6 Ereignisse in der Vererbung
    Ereignisse können nur in der Klasse ausgelöst werden, in der sie definiert sind. Mit anderen Worten bedeutet das auch, dass Ereignisse nicht vererbt werden."

    Nehm ich aber seinen Code 1:1 dann steht mir das Ereigniss auch für GraphicCircle zur Verfügung und wird auch ausgelösst?

    Code:
     class Program
        {
            static void Main(string[] args)
            {
                GraphicCircle gc = new GraphicCircle();               
                gc.InvalidMeasure += gc_InvalidMeasure;
                gc.Radius = -10;
                Console.ReadLine();
    
            }
    
            static void gc_InvalidMeasure(object sender)
            {
                Console.WriteLine("Ereignishandler: " );
            }
    
    // Basis Class Circle
    
    public delegate void InvalidMeasureEventHandler(Object sender);
    
        public class Circle
        {
            public event InvalidMeasureEventHandler InvalidMeasure;
    
            protected double mRadius = 0       
    
            public Circle()
            { }
    
            public Circle(double radius)
            {
                Radius = radius;          
            }
                               
                   
            public virtual double Radius
            {
                get { return mRadius; }
                set
                {
                    if (value >= 0)
                    {
                        mRadius = value;                   
                    }
                    else
                    {                     
                        OnInvalidMeasure();
                    }
                }
            }
    
            protected virtual void OnInvalidMeasure()
            {
                if (InvalidMeasure != null)
                    InvalidMeasure(this);
               
            }    
        }
    
    // Erbende Classe GraphicCircle
     public class GraphicCircle : Circle
        {
            public GraphicCircle()
            { }
    
            public GraphicCircle(double radius) :
                base(radius) { }       
        }
    
        }
    Zuletzt editiert von mmgg; 12.08.2014, 19:50. Reason: Titel berechtigt
    JonDonym: privacy needs anonymity more than ever

  • #2
    Hallo,

    Ereignisse werden sehr wohl an die Kind-Klassen vererbt, allerdings können die Ereignisse nur in der Klasse ausgelöst werden in der sie deklariert sind. Aus diesem Grund gibt es auch diese "protected void OnXXX(...)"-Methoden bzw. ist es nur so sinnvoll möglich ein Ereignis auch in einer Kind-Klasse auszulösen.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Ja das zeigt mein Beispiel,deswegen ja die Frage hier.
      So weit ich sehen kann wird das Ereignis, für Graphiccircle, auch ohne "protected" ausgelöst.
      "Protected" hab ich mit Absicht weggelassen,um es so nackt wie möglich hinzustellen.
      Zuletzt editiert von gfoidl; 13.08.2014, 14:15. Reason: Fullquote entfernt
      JonDonym: privacy needs anonymity more than ever

      Comment


      • #4
        Ereignisse können nur in der Klasse ausgelöst werden, in der sie definiert sind.
        Der Satz ist denke ich verständlicher als das Verhalten mit vererbar/nicht vererbar in Verbindung zu bringen.
        Du darfst InvalidMeasure(this) nicht direkt aus GraphicCircle aufrufen das geht nur aus Circle. In (oder via) GraphicCircle einen weiteren EventHandler an InvalidMeasure zu hängen ist aber, wie du festgestellt hast, kein Problem. Das ist einer der Gründe für das Muster mit der OnEventMethode (hier OnInvalidMeasure) damit man eben über diesen Umweg auch den Event aus Ableitungen aus ausführen kann wenn man das denn braucht.

        Comment


        • #5
          @ Ralf,
          Du darfst InvalidMeasure(this) nicht direkt aus GraphicCircle aufrufen das geht nur aus Circle
          Stimmt, weil es nicht vererbar ist, wie ich jetzt nach kleiner Erleuchtung zustimmen würde. Die Eigenschaft Radius ist zwar oben im Beipsile schon virtuell, im Buch aber erst in späteren Kapiteln, die ich jetzt noch mal durch bin.
          Man denke sich also GraphicCircle mit überschriebener Radius-Eigenschaft:

          Code:
           public override double Radius
                  {
                      get { return mRadius; }
                      set
                      {
                          if (value >= 0  && value < 20)
                          {
                              mRadius= value;
                          }
                          else
                          {
                             // if (base.InvalidMeasure != null)
                            //      base.InvalidMeasure(this);
                              OnInvalidMeasure();
                          }
                      }
                  }
          
           protected override void OnInvalidMeasure()
                  {
                      base.OnInvalidMeasure();
                  }
          Und wenn sie überschrieben wird, muss auch das Event gesetzt werden und eben hier zeigt sich, dass Events nicht vererbar sind. Denn InvalidMeasure ist da nicht verfügbar.
          Deswegen die OnX-Methoden(für alle Beginner die eventl auch da hängen bleiben, OnXxx sind keine besonderen Methoden, der Vorsatz "On"markiert sie nur als EigenschaftsMethoden, auch InvalidMeasure ist damit nicht verfügbar, verfügbar ist die OnXx der BaseClass).

          Abschliessend würd ich sagen, irgendwo am Beginn des Vererbungskapitels, schreibt der Autor, dass man unter Programm schon sehen kann, was GraphicCirlce alles geerbt hat.
          GraphicCirlce gc = new GraphicCirlce ()
          gc. Punkt setzen und die Liste geht auf.
          Das stimmt zwar, aber wenn er später im Event Kapitel schreiben würde: beachten sie, dass das Event zwar in der Liste erscheint, aber...
          JonDonym: privacy needs anonymity more than ever

          Comment

          Working...
          X