【问题标题】:C# equivalent of VB.NET interface implementationsC# 等效于 VB.NET 接口实现
【发布时间】:2014-02-15 20:35:06
【问题描述】:

我正在使用 VB 编写的 Web 服务并用 C# 重写它。 服务类实现了两个接口,每个接口有四个方法。 四个方法中的三个具有相同的签名方法名称和参数列表。第四种方法同名,但参数列表不同。

在 VB 中,您明确标识与公共服务类方法关联的接口方法。所以对于相同的方法,实现如下:

class WebServiceClass
{
   Public Function Method1(result as Int32) As String Implements Interface1.Method1, Interface2.Method1

   Public Sub Method2(Id as Int64, P3 as Int32) Implements Interface1.Method2

   Public Sub Method3(In as Int64) Implements Interface2.Method2
}

你能在 C# 中做到这一点吗?

我知道您可以使用 Interface.Method2(Id as Int64, ...) 和 Interface2.Method2(In as...) 显式定义 Web 服务类中的方法。但这意味着更改这些方法的名称,因此任何使用这些方法的应用程序都必须更新。

我也可以更改接口方法的名称以匹配 Web 服务方法,但任何使用这些接口的应用程序都必须更改。

是否有任何明确标识Web服务类中的接口方法,但保持Web服务类方法与原始方法相同的名称和签名?

【问题讨论】:

    标签: c# vb.net interface vb.net-to-c#


    【解决方案1】:

    不幸的是,在 C# 中根本没有与此 VB.NET 功能直接等效的功能。在 C# 中没有办法实现接口方法并给它一个不同的名称。这可以通过创建您想要的名称并将接口实现转发到该方法名称来模拟

    class WebServiceClass : Interface1, Interface2
    {
      public string Method1(int result) { ... }
      public void Method2(long id, int p3) { ... }
      public void Method3(long in) { ... }
    
      string Interface1.Method1(int result) { return Method1(result); }
      void Interface1.Method2(long id, int p3) { Method2(id, p3); }
      string Interface2.Method1(int result) { return Method1(result); }
      void Interface2.Method2(long in) { Method3(in); }
    }
    

    【讨论】:

    • 这是一个很好的模式;包含大量代码的显式接口实现通常是可继承类中的反模式,因为派生类不能包装它们。有一个显式的接口实现只是简单地链接到一个受保护的虚拟方法使事情变得更加简洁。
    • Method1、Method2 和 Method3 不应该是私有的吗?
    • @GloriaSantin 取决于您的情况以及您是否希望其他实例可以访问它们
    • @supercat 派生类可以通过将base 转换为接口类型,然后调用它们来包装继承的显式接口实现。或者你的意思是override而不是“wrap”,因为显式接口实现不能标记为virtual
    • @Dai:如果派生类实现了接口,则将base 转换为接口类型并调用它会调用派生类实现。
    猜你喜欢
    • 2013-12-28
    • 2013-04-12
    • 2015-09-30
    • 1970-01-01
    • 2011-12-05
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    相关资源
    最近更新 更多