Frage

Ok, also habe ich eine Basisklasse, die das Ereignis StatusTextChanged erklärt. Mein Kind Klasse, kann natürlich nicht direkt auf dieses Ereignis auslösen.

Also habe ich mit so etwas wie diese aufzuwickeln (der Einfachheit halber):

Public MustInherit Class FooBase
    Public Event StatusTextChanged(ByVal StatusText As String)
    Protected Sub RaiseStatusTextChangedEvent(ByVal StatusText As String)
        RaiseEvent StatusTextChanged(StatusText)
    End Sub
End Class

Und dann in der Kinderklasse I rufen MyBase.RaiseStatusTextChangedEvent("something"). Gibt es eine bessere oder mehr empfohlen Art und Weise, dies zu tun?

edit: VB.NET oder C #, oder so ist es im Wesentlichen die gleiche funktioniert

.

edit: Also nach den Antworten, dass ich in diesem in der Basisklasse bin, dann setzen Sie einfach die Statustext Eigenschaft in der Kindklasse ...

    Public Event StatusTextChanged(ByVal StatusText As String)
    Private _StatusText As String = "Idle."
    Public Property StatusText() As String
        Get
            Return _StatusText
        End Get
        Protected Set(ByVal value As String)
            RaiseEvent StatusTextChanged(value)
        End Set
    End Property
War es hilfreich?

Lösung

Ich würde sagen, dass Sie den Recommeneded Weg ziemlich nahe sind (oder zumindest die, die ich empfehlen würde).

Ich würde ein paar Änderungen an Ihrem Code machen, da eine Wahl:

  • Stellen StatusTextChanged Protected Overridable
  • Wrap Statustext in einer benutzerdefinierten EventArgs Klasse
  • Ändern Sie die StatusTextChanged Erklärung in Public Event StatusTextChanged As EventHandler(Of YourCustomEventArgs)

Der resultierende Code:

Die benutzerdefinierte EventArgs Klasse:

Public Class TextEventArgs
    Inherits EventArgs

    Private _text As String

    Public Sub New(ByVal text As String)
        _text = text
    End Sub

    Public ReadOnly Property Text() As String
        Get
            Return _text
        End Get
    End Property

End Class

Die Veranstaltung Implementierung in Ihrer Basisklasse:

Public Event StatusTextChanged As EventHandler(Of TextEventArgs)
Protected Overridable Sub OnStatusTextChanged(ByVal e As TextEventArgs)
    RaiseEvent StatusTextChanged(Me, e)
End Sub

... und schließlich eine Codezeile für das das Ereignis auslöst; entweder in der Basisklasse oder eine Klasse, die es erbt:

OnStatusTextChanged(New TextEventArgs("some text"))

Dies wird mehr im Einklang mit, wie die Ereignisse im Rest des .NET Framework entwickelt werden.

Andere Tipps

Es wäre denn es ein besonderer Bedarf für Ihre Kind-Klasse ist eine Basisklasse Methode außer Kraft zu setzen, dann würde ich sagen, dass die Basisklassenimplementierung Aufruf ist absolut die beste Lösung.

Das ist so ziemlich der normale Weg für Veranstaltungen auf einer Basisklasse über eine abgeleitete eines für diese Art von Szenario zu erhöhen.

Allerdings könnte dies ein wenig ändern, je nachdem, wer für die Hierarchie in der Steuerung des Statustextes ist. Wenn es ein konkretes Statustext dahinter liegendes Feld ist in FooBase, die nur über Zugriffsmethoden geändert werden können, dann würde ich nicht das Kind läßt die Anhebung des StatusTextChanged Ereignisses steuern. Stattdessen würde ich die Anhebung der Ereignisse zwingen, innerhalb des Setter der Immobilie für Statustext. Dies gibt die Elternklasse mehr Kontrolle in alle Verträge Strafvollzugs will um, wenn und wann nicht das Ereignis zu erhöhen.

Wenn jedoch der Statustext ist eine Eigenschaft, die von der abgeleiteten Klasse definiert werden muss, würde ich die Route wählen, die angezeigt werden.

Eine Option, die Sie haben könnten, ist die Status-Eigenschaft in der Basisklasse wickeln, so dass er das Ereignis wirft sich in einer Änderung (In C # wie Sie nicht wissen, VB und nicht den Zugang zu Visual Studio im Moment hat)

private string _status;

public string Status
{
    get { return _status; }
    protected set
    {
        if (_status == value) return;
        _status = value;
        StatusChanged(value);
    }
}

Hier ist mein Code für eine Veranstaltung mit einem Delegierten und einen Parameter Statustext

Public Event Status As StatusEventHandler

Protected Overridable Sub OnStatus(ByVal e As StatusEventArgs)
    RaiseEvent Status(Me, e)
End Sub

Public Delegate Sub StatusEventHandler(ByVal sender As Object, _
   ByVal e As StatusEventArgs)

<System.Serializable()> _
Public Class StatusEventArgs
    Inherits System.EventArgs

    Public Sub New()
    End Sub

    Public Sub New(ByVal statusText As String)
        _StatusText = statusText
    End Sub

    ' Enter code here for event properties, etc.

    Private _StatusText As String = ""
    Public Property StatusText() As String
        Get
            Return _StatusText
        End Get
        Set(ByVal value As String)
            _StatusText = value
        End Set
    End Property


End Class
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top