C# VB.Net';由于缺少隐式接口,I';我想做不可能的事?

C# VB.Net';由于缺少隐式接口,I';我想做不可能的事?,c#,vb.net,events,interface,implicit,C#,Vb.net,Events,Interface,Implicit,我知道VB.Net不允许像C#这样的隐式接口实现。因此,如下代码与VB.Net没有直接关联: public interface IBackgroundWorkerAdapter { bool IsBusy { get; set; } bool WorkerReportsProgress { get; set; } bool WorkerSupportsCancellation { get; set; } event DoWorkEventHandler DoWor

我知道VB.Net不允许像C#这样的隐式接口实现。因此,如下代码与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
{

}
因此,我在VB.Net中能想到的最接近的方法是使用
Shadows
关键字执行以下操作(因为没有任何操作是虚拟的):

然后,我尝试使用包装器,如下所示:

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()
但是,这当然不起作用(事件处理程序没有执行),可能是因为我正在调用
RunWorkerAsync
ReportProgress
方法的基类,并且基类没有使用隐藏事件因此,如果
BackgroundWorker
实现了一个类似于C#的接口,而不是使用VB.Net的显式接口实现,是否有任何方法可以实现相同的最终结果?


使用完整解决方案更新(使用Damien_非信徒的答案)
我认为,正如您已经展示的sub一样,您需要将所有调用传递给基类中的相同调用。最棘手的是事件处理程序,但是
DoWork
可以实现为:

Public Shadows自定义事件DoWork,因为DoWorkEventHandler实现了iBackgroundWorkedRadapter.DoWork
AddHandler(值为DoWorkEventHandler)
AddHandler MyBase.DoWork,值
EndAddHandler
RemoveHandler(值为DoWorkEventHandler)
RemoveHandler MyBase.DoWork,值
末端移除处理器
RaiseEvent(发送方作为对象,e作为DoWorkEventArgs)
MyBase.OnDoWork(e)
端部提升孔
结束事件

对于其他事件处理程序也是如此。这样,通过
DoWork
事件添加的事件处理程序实际上被添加到基类
DoWork
事件中。

为什么要使用接口?为什么甚至是子类?您的
BackgroundWorker
子类只是一个包装器,没有添加任何有用的内容(如您所示)。这里的目的是什么?“如果这只是一个一次性的自学实验,我能理解。”乔尔·范特。我想在代码中使用依赖项注入,直接引用
BackgroundWorker
是一个具体的依赖项。使用接口可以让人拥有松散耦合的代码。事实上,我是在你发布这篇文章后才想到的。这确实有效,而且是正确的答案。谢谢你证实我自己的结论。
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()
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