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
Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top