title: Does VB.Net's lack of implicit interfaces make what I'm trying to do impossible?
body: <p>I know VB.Net does not allow implicit interface implementation like C#. And thus code like the following has no direct VB.Net correlation:</p>
  
  <pre><code>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
  {
  
  }
  </code></pre>
  
  <p>So the closest think I could think of in VB.Net is to do the following using the <code>Shadows</code> keyword (since none of the operations are virtual):</p>
  
  <pre><code>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
  </code></pre>
  
  <p>Then I'm trying to use the wrapper as follows:</p>
  
  <pre><code>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()
  </code></pre>
  
  <p>Yet, of course this doesn't work (the event handler's are not executing), likely because I'm calling the base class for the <code>RunWorkerAsync</code> and <code>ReportProgress</code> methods, and the base class isn't using the Shadowed events. <strong>Thus, is there any way to achieve the same end result where the <code>BackgroundWorker</code> implements an interface like in C#, but instead using explicit interface implementation for VB.Net?</strong></p>
  
  <hr>
  
  <h2>UPDATE With Full Solution <sub><sup>(Using Damien_The_Unbeliever's answer)</sup></sub></h2>
  
  <pre><code>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
  </code></pre>