Eventos de base classes

votos
3

Ok, então eu tenho uma classe base que declara o evento StatusTextChanged. Minha classe criança, claro que não pode levantar directamente este evento.

Então eu acabar com algo parecido com isso (por causa da simplicidade):

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

E, em seguida, na classe criança eu chamo MyBase.RaiseStatusTextChangedEvent(something). Existe uma maneira melhor ou mais recomendado para fazer isso?

edit: VB.NET ou C #, de qualquer forma ele funciona essencialmente o mesmo.

edit: Então, depois de as respostas, eu estou neste na classe base, em seguida, basta definir a propriedade StatusText na classe criança ...

    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
Publicado 19/05/2009 em 15:45
fonte usuário
Em outras línguas...                            


5 respostas

votos
6

Eu diria que você é bastante próxima à maneira recommeneded (ou pelo menos o que eu recomendaria).

Gostaria de fazer algumas alterações ao seu código, dada uma escolha:

  • Faça StatusTextChanged Protected Overridable
  • Enrole StatusText em uma classe EventArgs personalizados
  • Altere a declaração StatusTextChanged em Public Event StatusTextChanged As EventHandler(Of YourCustomEventArgs)

O código resultante:

A classe EventArgs personalizados:

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

A implementação evento em sua classe base:

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

... e, finalmente, uma linha de código para disparar o evento; quer na classe base ou uma classe que herda-lo:

OnStatusTextChanged(New TextEventArgs("some text"))

Este será mais em linha com a forma como os eventos são projetados dentro do resto do framework .NET.

Respondeu 19/05/2009 em 15:55
fonte usuário

votos
1

A menos que haja uma necessidade específica para sua classe filho para substituir um método classe base, então eu diria que chamar a implementação de classe base é absolutamente a melhor solução.

Respondeu 19/05/2009 em 15:47
fonte usuário

votos
0

Aqui está o meu código para um evento com um delegado e um parâmetro de texto de status

Aberta Evento Como StatusEventHandler

Sub protegido Overridable onStatus (ByVal e As StatusEventArgs)
    RaiseEvent Estado (Me, e)
End Sub

Delegado público Sub StatusEventHandler (ByVal sender As Object, _
   e ByVal como StatusEventArgs)

<System.Serializable ()> _
StatusEventArgs Classe pública
    System.EventArgs herda

    Public Sub New ()
    End Sub

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

    'Digite o código aqui para propriedades de evento, etc.

    _StatusText privada As String = ""
    Público StatusText Property () As String
        Obter
            retorno _StatusText
        End Get
        Jogo (valor ByVal como String)
            _StatusText = valor
        End Set
    End Property


End Class
Respondeu 20/05/2009 em 13:32
fonte usuário

votos
0

Uma opção que você pode ter é envolver a propriedade Estado na classe base, de modo que ele levanta o próprio evento em uma mudança (em C # como Não sei VB e não tem acesso ao Visual Studio no momento)

private string _status;

public string Status
{
    get { return _status; }
    protected set
    {
        if (_status == value) return;
        _status = value;
        StatusChanged(value);
    }
}
Respondeu 19/05/2009 em 16:05
fonte usuário

votos
0

Isso é muito bonito a forma padrão para a criação de eventos em uma classe base via um derivado para este tipo de cenário.

No entanto isso pode mudar um pouco dependendo de quem está no controle do StatusText para a hierarquia. Se houver um campo de apoio StatusText concreto em FooBase que só pode ser alterado por meio de assessores, então eu não iria deixar controlar a criança a elevação do evento StatusTextChanged. Em vez disso eu iria forçar o aumento dos eventos dentro do setter da propriedade para StatusText. Isto dá a classe pai mais controle na aplicação de quaisquer contratos que quer em torno de quando e quando não levantar referido evento.

No entanto, se o StatusText é uma propriedade que deve ser definido pela classe derivada, eu escolheria a rota que você exibido.

Respondeu 19/05/2009 em 15:50
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more