2014-01-24 39 views
4

我正在用VB編寫一個Web服務,並用C#重寫它。 服務類實現兩個接口,每個接口有四個方法。 四種方法中的三種具有相同的簽名方法名稱和參數列表。第四種方法具有相同的名稱,但具有不同的參數列表。C#相當於VB.NET接口實現

在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爲Int64,...)和Interface2.Method2(In as ...)顯式地定義Web服務類中的方法。但是這意味着改變這些方法的名稱,因此任何使用這些方法的應用程序都必須更新。

我也可以更改接口方法的名稱以匹配Web服務方法,但使用這些接口的任何應用程序都必須更改。

是否有任何顯式標識Web服務類中的接口方法,但保持Web服務類方法與原始方法相同的名稱和簽名?

回答

7

不幸的是,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); } 
} 
+0

這是一個很好的模式;包含大量代碼的顯式接口實現通常是可繼承類中的反模式,因爲派生類不能包裝它們。擁有一個明確的接口實現只需鏈接到一個受保護的虛擬方法就可以使事情變得更加清晰 – supercat

+0

不應將Method1,Method2和Method3設置爲私有? –

+0

@GloriaSantin取決於你的情況,以及你是否希望他們可以被其他實例訪問 – JaredPar