Pregunta

Me gustaría sombra / anular un evento en VB.NET.

I hacerlo solamente porque tengo que aplicar en este objeto de una interfaz, que contiene el mismo evento como el propio objeto de base, y que necesita para mantener este evento de base como lo es sin modificación ni eventos complementario adiciones.

¿Cómo puedo hacerlo?

Public Shadows Event VisibleChanged As EventHandler Implements IVisibleChanged

Por lo tanto, me gustaría implementar una interfaz que contiene evento VisibleChanged, pero para mantener funcional el evento myBase VisibleChanged también.

  Public Shadows Event VisibleChanged As EventHandler Implements IVisibleChanged
    AddHandler(ByVal value As EventHandler)
      AddHandler MyBase.VisibleChanged, value
    End AddHandler
    RemoveHandler(ByVal value As EventHandler)
      RemoveHandler MyBase.VisibleChanged, value
    End RemoveHandler
  End Event

algo como esto, pero parece Visual Studio no reconoce como una sintaxis ...

Es decir, en C # Me di cuenta de que de esta manera:

public new event EventHandler VisibleChanged
{
    add { base.VisibleChanged += value; }
    remove { base.VisibleChanged -= value; }
}
¿Fue útil?

Solución

Option Strict On
Option Explicit On

Public Class Form1
  Public Sub New()
    ' This call is required by the Windows Form Designer.'
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.'
    Dim b As New MyButton
    Me.Controls.Add(b)
    b.Name = "customButton"
    b.Location = New Point(10, 10)
    b.Text = "Hit me!"
    AddHandler CType(b, IMyInterface).Click, AddressOf MyButton1_Click
  End Sub

  Private Sub MyButton1_Click( _ 
      ByVal sender As System.Object, ByVal e As System.EventArgs)
    Debug.Print("{0} clicked!; ", CType(sender, Control).Name)
  End Sub
End Class

' ------- interface'
Public Interface IMyInterface
  Event Click As EventHandler
End Interface

' ------- class'
Public Class MyButton
  Inherits System.Windows.Forms.Button
  Implements IMyInterface
  ' ============ HERE IS THE SOLUTION'
  Private Event Click1 As EventHandler Implements IMyInterface.Click

  Private Sub ResendClick( _ 
      ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Click
    RaiseEvent Click1(sender, e)
  End Sub
  ' END HERE IS THE SOLUTION ============ '
End Class

Otros consejos

Cuando se implementa una interfaz en VB.NET, no es necesario nombrar a la aplicación del mismo nombre de la interfaz.

Ejemplo interfaz:

Public Interface IFoo
    Event Bar As EventHandler
End Interface

Ejemplo aplicación:

Public Class FooImplementation
    Implements IFoo

    ' This is the built-in Bar event, specific to this class.
    Public Event Bar As EventHandler

    ' This is the implemented IFoo.Bar event.
    Public Event IFooBar As EventHandler Implements IFoo.Bar

End Class

Cuando alguien se une a usted como un IFoo, obtendrán su evento IFooBar:

Dim instance As IFoo = New FooImplementation()
AddHandler instance.Bar, AddressOf IFooBarHandler

Cuando están unidos a usted como FooImplementation, van a tener el evento bar y también podrán adjuntar a IFooBar:

Dim instance As New FooImplementation()
AddHandler instance.Bar, AddressOf BarHandler
AddHandler instance.IFooBar, AddressOf IFooBarHandler

¿Se puede sustituir el controlador en una clase derivada?

Public Class OverriddenClass
Inherits OriginalClass
Protected Overrides Function ProcessVisibleChanged(ByRef msg as Message, value as ...) As Boolean
  value = value + 1
  ProcessVisibleChanged = MyBase.ProcessVisibleChanged(msg, value)
  ' or use OnVisibleChanged to avoid the base handler
End Function
end class
  Public Shadows Event VisibleChanged As EventHandler Implements IVisibleChanged
    AddHandler(ByVal value As EventHandler)
      AddHandler MyBase.VisibleChanged, value
    End AddHandler
    RemoveHandler(ByVal value As EventHandler)
      RemoveHandler MyBase.VisibleChanged, value
    End RemoveHandler
  End Event

algo como esto, pero parece Visual Studio no reconoce como una sintaxis ...

Es decir, en C # Me di cuenta de que de esta manera:

public new event EventHandler VisibleChanged
{
    add { base.Click += value; }
    remove { base.Click -= value; }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top