Événements des classes de base
-
22-08-2019 - |
Question
Ok, donc j'ai une classe de base qui déclare la StatusTextChanged
de l'événement. Ma classe enfant, bien sûr ne peut pas soulever directement cet événement.
Alors je le vent avec quelque chose comme ça (pour l'amour de la simplicité):
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
Et puis dans la classe de l'enfant que j'appelle
MyBase.RaiseStatusTextChangedEvent("something")
.
Y at-il une meilleure façon agréable et recommandé de le faire?
modifier: VB.NET ou C #, de toute façon, il fonctionne essentiellement la même
.edit: Donc, après les réponses, je suis à cela dans la classe de base, puis définissez simplement la propriété StatusText dans la classe enfant ...
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
La solution
Je dirais que vous êtes assez proche de la voie recommeneded (ou au moins celui que je recommande).
Je voudrais faire quelques modifications à votre code, étant donné un choix:
- StatusTextChanged
Protected Overridable
- Wrap StatusText dans une classe EventArgs personnalisées
- Modifier la déclaration StatusTextChanged dans
Public Event StatusTextChanged As EventHandler(Of YourCustomEventArgs)
Le code résultant:
La classe EventArgs personnalisés:
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
La mise en œuvre de l'événement dans votre classe de base:
Public Event StatusTextChanged As EventHandler(Of TextEventArgs)
Protected Overridable Sub OnStatusTextChanged(ByVal e As TextEventArgs)
RaiseEvent StatusTextChanged(Me, e)
End Sub
... et enfin une ligne de code pour augmenter l'événement; soit dans la classe de base ou une classe qui hérite:
OnStatusTextChanged(New TextEventArgs("some text"))
Ce sera plus conforme à la façon dont les événements sont conçus dans le reste du framework .NET.
Autres conseils
À moins d'un besoin spécifique pour votre classe enfant pour remplacer une méthode de classe de base alors je dirais que l'appel de la mise en œuvre de la classe de base est absolument la meilleure solution.
est à peu près le moyen standard pour élever des événements sur une classe de base via un dérivé pour ce type de scénario.
Cependant, cela pourrait changer un peu en fonction de qui est dans le contrôle de la StatusText pour la hiérarchie. S'il y a un champ de support StatusText béton FooBase qui ne peut être changé par accesseurs, je ne laisserais pas l'enfant à contrôler la levée de l'événement StatusTextChanged. Au lieu de cela, je forcerais la levée des événements dans le Setter de la propriété pour StatusText. Cela donne plus de contrôle classe mère dans l'application des contrats qu'elle veut autour quand et quand ne pas soulever ledit événement.
Toutefois, si l'StatusText est une propriété qui doit être définie par la classe dérivée, je choisirais la route que vous avez affichée.
L'une des options que vous pourriez avoir est envelopper la propriété d'état dans la classe de base, afin qu'il déclenche l'événement lui-même dans un changement (En C # que VB ne sais pas et ne pas avoir accès à Visual Studio pour le moment)
private string _status;
public string Status
{
get { return _status; }
protected set
{
if (_status == value) return;
_status = value;
StatusChanged(value);
}
}
Voici mon code pour un événement avec un délégué et un paramètre de texte d'état
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