2016-06-02 3 views
0

나는 이라는 서비스를 SoapHttpClientProtocol에서 상속 받았습니다.C# : 다른 서비스에서 다중 상속없이 한 클래스의 함수를 재정의하는 방법

또한 ServiceA에서 상속 된 클래스 ProcessingHelperClass이 있으며 일부 재정의 된 기능과 두 개의 추가 필드가 있습니다.

나는 많은 ServiceA 종류의 서비스를 가지고 있습니다. 그리고 나는 그들 모두를 위해 오버라이드 된 함수로 내 class을 생성해야한다.

질문 : 포함하는 모든 서비스에 대해 새 클래스를 만들 필요가 없으므로 다른 서비스에 대한 재정의 기능 및 추가 필드가있는 클래스를 만드는 방법이 있습니까?

그리고 내 질문은 프로그램의 의미에서 아주 나쁜 경우 내가 초보자에게있어, 나는, 왜 배울 기쁠

UPD : 의사 코드 Reference.cs (서비스 프록시 클래스 파일)

public partial class ServiceA : SoapHttpClientProtocol 
{ 
    public void Method1(){}; 
    public void Method2(){}; 
    //etc... 

} 

ProcessingHelperClass.cs

public class ProcessingHelperClass: ServiceA, IDisposable 
{ 
    private XmlWriter _xmlWriter; 
    public String StringA => xmlWriter == null? "" : _xmlWriter.Xml; 
    ... 
    protected override XmlWriter GetWriterForMessage(System.Web.Services.Protocols.SoapClientMessage message, int bufferSize) 
    { 
     var writer = base.GetWriterForMessage(message, bufferSize); 
     _xmlWriterSpy = new XmlWriterSpy(writer); 
     return _xmlWriterSpy; 
    } 
} 

Program.cs

static void Main(string[] args) 
{ 
    ProcessingHelperClass client = new ProcessingHelperClass(); 
    client.Method1(); 
    Console.Writeline(client.StringA); 
} 
+2

의사 코드를 올리시겠습니까? 원하는 것을 수행 할 수 있습니까? – Dennis

+0

https://en.wikipedia.org/wiki/Composition_over_inheritance에서 살펴보십시오. 당신은 implement - methods를 클래스의 인스턴스를 서비스의 멤버 *로 추가하여 원하는 것을 구현해야한다. 실제 메서드가 다른 클래스에 저장되기 때문에이 경우 SoapHttpClientProtocol에서 파생 될 필요가 없습니다. – HimBromBeere

+0

가상 코드가 추가되었습니다. 희망이 도움이됩니다. 잘못된 것이 있으면 알려주세요. – anindis

답변

0

C#에서는 한 클래스에서만 상속받을 수 있습니다. 이렇게하면 한 클래스의 여러 클래스에서 올린 메서드를 유효한 전략으로 대신 할 수 있습니다. 그러나 여러 인터페이스를 상속받을 수는 있습니다. 여러 인터페이스를 상속 할 수있는 경우 이러한 인터페이스를 하나의 클래스로 구현할 수 있습니다.

public interface IServiceA 
{ 
    bool IsVisible(); 
} 
public interface IServiceB 
{ 
    void SetValue(); 
} 
public class SomeClass : IServiceA, IServiceB 
{ 
    public bool IsVisible(){} 
    public void SetValue(){} 
} 

단점은 이전에 구현 된 방법이 없으므로 이전에 구현 된 방법을 다시 사용할 수 없다는 점입니다. 이것은 각 인터페이스에 대한 클래스를 개별적으로 구현 한 다음이 클래스의 객체를 하나의 '수퍼 클래스'로 결합하여 대처할 수 있습니다.

public interface IServiceA 
{ 
    bool IsVisible(); 
} 
public interface IServiceB 
{ 
    void SetValue(); 
} 
public class ServiceA : IServiceA 
{ 
    public bool IsVisible(){} 
} 
public class ServiceB : IServiceB 
{ 
    public void SetValue(){} 
} 
public class SomeClass : IServiceA, IServiceB 
{ 
    private IServiceA _a; 
    private IServiceB _b; 

    public SomeClass(IServiceA a, IServiceB b) 
    { 
     _a = a; 
     _b = b; 
    } 

    public bool IsVisible() 
    { 
    _a.IsVisible(); // if you want to re-use 
    } 
    public void SetValue() 
    { 
     // implement some logic here if you want to 'override' 
    } 
} 
관련 문제