代码之家  ›  专栏  ›  技术社区  ›  Jules

接口转换vb.net版至c#

  •  1
  • Jules  · 技术社区  · 14 年前

    我有一个控件重写受保护的GetService方法并将其分配给IServiceProvider接口:

    Class MyControl
        Inherits Control
        Implements IServiceProvider
    
        Protected Overrides Sub GetService(t as Type) as Object Implements IServiceProvider.GetService
        End Sub
    
    End Class
    

    3 回复  |  直到 14 年前
        1
  •  2
  •   Thomas Levesque    14 年前

    原版VB.NET版方法是受保护的,所以我猜它相当于C#中的显式接口实现:

    class MyControl : Control, IServiceProvider
    {
         object IServiceProvider.GetService(Type t)
         {
             ...
         }
    }
    
        2
  •  7
  •   Reed Copsey    14 年前

    class MyControl : Control, IServiceProvider
    {
         // Explicitly implement this
         object IServiceProvider.GetService(Type t)
         {
              // Call through to the protected version
              return this.GetService(t);
         }
    
         // Override the protected version...
         protected override object GetService(Type t)
         {
         }
    }
    

    也就是说,控件已经实现了IServiceProvider(通过组件)。你真的可以做:

    class MyControl : Control
    {
         protected override object GetService(Type t)
         {
         }
    }
    
        3
  •  4
  •   JaredPar    14 年前

    这有点小问题VB.Net版移植到C#时需要考虑的接口实现。一种在中实现的接口方法VB.Net版本质上在同一行中使用隐式和显式接口实现。这允许出现诸如名称不匹配和非公共实现之类的情况。

    例如,以下也是 IServiceProvider

    Class Example 
      Implements IServiceProvider
    
      Private Sub GetServiceWrongName(t As Type) As Object Implements IServiceProvider.GetService
        ...
      End Sub
    End Class
    

    它大致可以转换为以下C代码

    class Example : IServiceProvider {
      public object GetServiceWrongName(t as Type) {
        ..
      }
    
      object IServiceProvider.GetService(t as Type) {
        return GetServiceWrongName(t);
      }
    
    }