Heim >Backend-Entwicklung >C++ >Wie löst man geerbte Ereignisse in von C# abgeleiteten Klassen korrekt aus?

Wie löst man geerbte Ereignisse in von C# abgeleiteten Klassen korrekt aus?

Linda Hamilton
Linda HamiltonOriginal
2024-12-25 16:03:10321Durchsuche

How to Correctly Raise Inherited Events in C# Derived Classes?

Auslösen geerbter Ereignisse in C

In der objektorientierten Programmierung ist es üblich, dass Klassen Ereignisse von ihren Basisklassen erben. Das Erhöhen dieser geerbten Ereignisse kann jedoch zu Verwirrung führen. Diese Frage befasst sich mit dem Fehler, der auftritt, wenn versucht wird, ein geerbtes Ereignis in einer abgeleiteten Klasse auszulösen, und bietet eine Lösung dafür.

Problem

In einer Basisklasse, die wie folgt definiert ist:

public class BaseClass
{
    public event EventHandler Loading;
    public event EventHandler Finished;
}

Eine abgeleitete Klasse versucht, das geerbte Ereignis auszulösen:

public class DerivedClass : BaseClass
{
    // Error: 'BaseClass.Loading' can only appear on the left hand side of += or -=
    this.Loading(this, new EventHandler());
}

Dieser Fehler weist darauf hin, dass auf das Ereignis nicht direkt über zugegriffen werden kann Schlüsselwort „this“.

Lösung

Um ein geerbtes Ereignis auszulösen, müssen Sie geschützte Methoden in der Basisklasse definieren, um den Ereignisaufruf zu verarbeiten. Mit diesen Methoden kann das Ereignis auch dann ausgelöst werden, wenn die abgeleitete Klasse das Ereignis überschreibt.

public class BaseClass
{
    public event EventHandler Loading;
    public event EventHandler Finished;

    protected virtual void OnLoading(EventArgs e)
    {
        EventHandler handler = Loading;
        if (handler != null) handler(this, e);
    }

    protected virtual void OnFinished(EventArgs e)
    {
        EventHandler handler = Finished;
        if (handler != null) handler(this, e);
    }

    // Invoking the events from the derived class
    public class DerivedClass : BaseClass
    {
        public void RaiseLoadingEvent()
        {
            OnLoading(EventArgs.Empty);
        }

        public void RaiseFinishedEvent()
        {
            OnFinished(EventArgs.Empty);
        }
    }
}

Durch den Aufruf von OnLoading oder OnFinished in der abgeleiteten Klasse werden die Handler aufgerufen, die die Ereignisse in der Basisklasse abonniert haben , um eine ordnungsgemäße Ereignisbehandlung in den abgeleiteten Klassen sicherzustellen.

Das obige ist der detaillierte Inhalt vonWie löst man geerbte Ereignisse in von C# abgeleiteten Klassen korrekt aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn