Veranstaltungen in Basisklassen
-
22-08-2019 - |
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
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