La falta de interfaces implícitas de VB.Net hace imposible lo que intento hacer?
Sé que VB.Net no permite la implementación de interfaces implícitas como C #. Y así, el código como el siguiente no tiene correlación directa VB.Net:
public interface IBackgroundWorkerAdapter
{
bool IsBusy { get; set; }
bool WorkerReportsProgress { get; set; }
bool WorkerSupportsCancellation { get; set; }
event DoWorkEventHandler DoWork;
event ProgressChangedEventHandler ProgressChanged;
event RunWorkerCompletedEventHandler RunWorkerCompleted;
void RunWorkerAsync();
void CancelAsync();
void ReportProgress(int progressPercent);
void ReportProgress(int progressPercent, object userState);
}
public class BackgroundWorkerAdapter: BackgroundWorker, IBackgroundWorkerAdapter
{
}
Así que lo más parecido que se me ocurre en VB.Net es hacer lo siguiente usandoShadows
palabra clave (ya que ninguna de las operaciones es virtual):
Public Class BackgroundWorkerAdapter
Inherits BackgroundWorker
Implements IBackgroundWorkerAdapter
Public Shadows ReadOnly Property IsBusy As Boolean _
Implements IBackgroundWorkerAdapter.IsBusy
Get
Return MyBase.IsBusy
End Get
End Property
Public Shadows Property WorkerReportsProgress As Boolean _
Implements IBackgroundWorkerAdapter.WorkerReportsProgress
Get
Return MyBase.WorkerReportsProgress
End Get
Set(ByVal value As Boolean)
MyBase.WorkerReportsProgress = value
End Set
End Property
Public Shadows Property WorkerSupportsCancellation As Boolean _
Implements IBackgroundWorkerAdapter.WorkerSupportsCancellation
Get
Return MyBase.WorkerSupportsCancellation
End Get
Set(ByVal value As Boolean)
MyBase.WorkerSupportsCancellation = value
End Set
End Property
Public Shadows Event DoWork(
ByVal sender As Object,
ByVal e As System.ComponentModel.DoWorkEventArgs) _
Implements IBackgroundWorkerAdapter.DoWork
Public Shadows Event ProgressChanged(
ByVal sender As Object,
ByVal e As System.ComponentModel.ProgressChangedEventArgs) _
Implements IBackgroundWorkerAdapter.ProgressChanged
Public Shadows Event RunWorkerCompleted(
ByVal sender As Object,
ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) _
Implements IBackgroundWorkerAdapter.RunWorkerCompleted
Public Sub New()
MyBase.New()
End Sub
Public Shadows Sub CancelAsync() _
Implements IBackgroundWorkerAdapter.CancelAsync
MyBase.CancelAsync()
End Sub
Public Shadows Sub ReportProgress(ByVal progressPercent As Integer) _
Implements IBackgroundWorkerAdapter.ReportProgress
MyBase.ReportProgress(progressPercent)
End Sub
Public Shadows Sub ReportProgress(
ByVal progressPercent As Integer,
ByVal userState As Object) _
Implements IBackgroundWorkerAdapter.ReportProgress
MyBase.ReportProgress(progressPercent, userState)
End Sub
Public Shadows Sub RunWorkerAsync() _
Implements IBackgroundWorkerAdapter.RunWorkerAsync
MyBase.RunWorkerAsync()
End Sub
End Class
Entonces estoy tratando de usar el contenedor de la siguiente manera:
Private ReadOnly _Worker As IBackgroundWorkerAdapter
Public ReadOnly Property Worker() As IBackgroundWorkerAdapter
Get
Return _Worker
End Get
End Property
...
AddHandler Me.Worker.DoWork,
Sub()
...
End Sub
AddHandler Me.Worker.ProgressChanged,
Sub(sender, e)
Dim args = DirectCast(e, ProgressChangedEventArgs)
...
End Sub
AddHandler Me.Worker.RunWorkerCompleted,
Sub()
...
End Sub
Me.Worker.RunWorkerAsync()
Sin embargo, por supuesto, esto no funciona (el controlador de eventos no se está ejecutando), probablemente porque estoy llamando a la clase base para elRunWorkerAsync
yReportProgress
métodos, y la clase base no está usando los eventos sombreados. @or lo tanto, ¿hay alguna manera de lograr el mismo resultado final donde elBackgroundWorker
impleme, establece una interfaz como en C #, pero en su lugar usa una implementación de interfaz explícita para VB.Net
Imports System.ComponentModel
Public Class BackgroundWorkerAdapter
Inherits BackgroundWorker
Implements IBackgroundWorkerAdapter
Public Shadows ReadOnly Property IsBusy As Boolean _
Implements IBackgroundWorkerAdapter.IsBusy
Get
Return MyBase.IsBusy
End Get
End Property
Public Shadows Property WorkerReportsProgress As Boolean _
Implements IBackgroundWorkerAdapter.WorkerReportsProgress
Get
Return MyBase.WorkerReportsProgress
End Get
Set(ByVal value As Boolean)
MyBase.WorkerReportsProgress = value
End Set
End Property
Public Shadows Property WorkerSupportsCancellation As Boolean _
Implements IBackgroundWorkerAdapter.WorkerSupportsCancellation
Get
Return MyBase.WorkerSupportsCancellation
End Get
Set(ByVal value As Boolean)
MyBase.WorkerSupportsCancellation = value
End Set
End Property
Public Shadows Custom Event DoWork As DoWorkEventHandler _
Implements IBackgroundWorkerAdapter.DoWork
AddHandler(ByVal value As DoWorkEventHandler)
AddHandler MyBase.DoWork, value
End AddHandler
RemoveHandler(ByVal value As DoWorkEventHandler)
RemoveHandler MyBase.DoWork, value
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
MyBase.OnDoWork(e)
End RaiseEvent
End Event
Public Shadows Custom Event ProgressChanged As ProgressChangedEventHandler _
Implements IBackgroundWorkerAdapter.ProgressChanged
AddHandler(ByVal value As ProgressChangedEventHandler)
AddHandler MyBase.ProgressChanged, value
End AddHandler
RemoveHandler(ByVal value As ProgressChangedEventHandler)
RemoveHandler MyBase.ProgressChanged, value
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs)
MyBase.OnProgressChanged(e)
End RaiseEvent
End Event
Public Shadows Custom Event RunWorkerCompleted As RunWorkerCompletedEventHandler _
Implements IBackgroundWorkerAdapter.RunWorkerCompleted
AddHandler(ByVal value As RunWorkerCompletedEventHandler)
AddHandler MyBase.RunWorkerCompleted, value
End AddHandler
RemoveHandler(ByVal value As RunWorkerCompletedEventHandler)
RemoveHandler MyBase.RunWorkerCompleted, value
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs)
MyBase.OnRunWorkerCompleted(e)
End RaiseEvent
End Event
Public Sub New()
MyBase.New()
End Sub
Public Shadows Sub CancelAsync() _
Implements IBackgroundWorkerAdapter.CancelAsync
MyBase.CancelAsync()
End Sub
Public Shadows Sub ReportProgress(ByVal progressPercent As Integer) _
Implements IBackgroundWorkerAdapter.ReportProgress
MyBase.ReportProgress(progressPercent)
End Sub
Public Shadows Sub ReportProgress(
ByVal progressPercent As Integer,
ByVal userState As Object) _
Implements IBackgroundWorkerAdapter.ReportProgress
MyBase.ReportProgress(progressPercent, userState)
End Sub
Public Shadows Sub RunWorkerAsync() _
Implements IBackgroundWorkerAdapter.RunWorkerAsync
MyBase.RunWorkerAsync()
End Sub
End Class