2014-01-24 2 views
4

VB에서 작성된 웹 서비스를 C#으로 다시 작성하고 있습니다. 서비스 클래스는 각각 네 개의 메소드가있는 두 개의 인터페이스를 구현합니다. 4 개의 메소드 중 3 개의 메소드 이름과 매개 변수 목록이 동일한 시그니처를가집니다. 네 번째 메서드는 이름은 같지만 매개 변수 목록은 다릅니다.VB.NET 인터페이스 구현에 해당하는 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는 Int64, ...) 및 Interface2.Method2 (In ...)로 메소드를 명시 적으로 정의 할 수 있습니다. 그러나 이러한 방법의 이름을 변경하면 결과적으로 이러한 메서드를 사용하는 모든 응용 프로그램을 업데이트해야합니다.

웹 서비스 메서드와 일치하도록 인터페이스 메서드의 이름을 변경할 수도 있지만 이러한 인터페이스를 사용하는 응용 프로그램은 변경해야합니다.

웹 서비스 클래스의 인터페이스 메서드를 명시 적으로 식별하지만 웹 서비스 클래스 메서드를 원본과 동일한 이름과 서명으로 유지하는 클래스가 있습니까?

답변

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

관련 문제