2011-02-18 4 views
6

ISomeBehavior를 구현하는 두 클래스가 있습니다. 이제는 그들에게 기능을 공유하길 원합니다. 일반적으로 ISomeBehavior를 SomeBehaviorBase와 같은 추상 클래스로 대체합니다. 문제는 이미 다른 클래스에서 파생 된 하위 클래스 중 하나이며 다른 클래스는 우리가 소유 한 소프트웨어가 아니라는 것입니다. (이것은 C#이므로 다중 상속은 옵션이 아닙니다.) 제 3 자 클래스에서 파생 된 서브 클래스에는 구현이 없습니다. 이것은 단순히 제 3 자 클래스에서 파생되고 ISomeBehavior를 구현하므로 제 3 자 클래스는 ISomeBehavior를 구현하는 다른 하위 클래스와 동일한 방식으로 처리 될 수 있습니다.하위 클래스가 이미 다른 기본 클래스에서 파생 된 경우 어떻게 동작을 공유 할 수 있습니까?

내가 한 것은 잠시 ISomeBehavior에서 확장 메서드를 구현하는 것입니다. 이제 소비 코드 메서드를 호출 할 수 있습니다. 이 방법의 문제점은 호출 코드가이 확장 메서드를 사용하도록하고 싶다는 것입니다. 인터페이스에서 SomeMethod()를 제거 할 수 없습니다. 확장 메서드가 결국 호출해야하기 때문입니다.

두 클래스를 다른 클래스, 제 3 자 클래스에서 이미 파생 시켰을 때 두 클래스가 동일한 동작을 우아하게 공유하도록하는 방법에 대한 아이디어가 있습니까? 참고 : 전략 디자인 패턴은 여기에 맞는 것처럼 들리지만, 동작은 이 하위 클래스 중으로 변할 때 사용됩니다. 여기서의 행동은 변하지 않습니다. 단지 공유해야합니다. http://www.codeproject.com/KB/architecture/smip.aspx

GJ

+0

SomeMethod() 란 무엇입니까? 두 번째 단락에서 언급 할 수는 있지만 제거 할 수 없다고 말하면서 * 제거 할 이유 *를 알지 못합니다. –

+0

클라이언트 코드가 그것을 사용할 수 없도록 SomeMethod()를 제거하려고합니다. 확장 메서드는 그것을 호출합니다. 그리고 클라이언트 코드는 확장 메서드를 호출합니다. 확장 메서드는 기본적으로 SomeMethod()이지만 두 개의 추가 매개 변수가 있습니다. 이것은 SomeMethod()가 SomeMethod를 호출하기 전에 확장 처리를 할 수있게합니다. –

답변

5

현재 제 3 자 클래스에서 파생 클래스를 구현하는 대신 대표단의 구성을 사용할 수없는 이유가있다 :

+0

그러면 하위 클래스가 인터페이스를 구현하고 제 3 자 클래스에서 동일한 메소드를 호출하게됩니다. 그게 맞습니까? 그런 다음 해당 하위 클래스는 제 3 자 클래스에 대한 참조도 보유해야합니다. 나는 그 기회를 줄 수있다. –

+0

@Bob : 맞습니다. –

+0

감사합니다. 나는 그 장면을 줄 수 있고 그것이 어떻게 작동하는지 볼 수있다.위의 여러 상속 주석을 시뮬레이트 한 것은 흥미 롭습니다. 나는 그것도 확인하고 싶다. –

2

다음은이 주제에 대한 좋은 기사입니다? 모든 인터페이스 메소드를 제 3 자 클래스의 인스턴스에 위임하면됩니다. 그렇게하면 기능을 추가하려는 경우 공통 기본 클래스를 사용할 수 있습니다.

개체 ID가 관련된 일부 경우에는 작동하지 않지만 대부분의 경우 완벽하게 합리적인 설계입니다.

+0

좋은 링크와 주제,하지만 거기에 몇 가지 복잡하고 죄책감을 다루고 싶지 않아. 감사. –

0
public interface ISomeBehavior 
    { 
     int Sample(); 
    } 

    public class A : ISomeBehavior 
    { 
     int ISomeBehavior.Sample() 
     { 
      return 1; 
     } 
    } 

    static class SomeExtension 
    { 
     public static int Sample(this ISomeBehavior obj) 
     { 
      return 2; 
     } 
    } 

후 사용이

A a = new A(); 
    var a1 = ((ISomeBehavior)a).Sample(); // a1 = 1 
    var a2 = a.Sample();      // a2 = 2 
0

어떻게 이런 일에 대해 :

class MyClass: ThirdPartyClass 
{ 
} 

class MyFunctionality 
{ 
    public MyFunctionality(ThirdPartyClass target) 
    ... 
} 

interface IMyFunctionality 
{ 
    public MyFunctionality MyFunctionality; 
} 

그래서 인터페이스, 파생 클래스는 현재 부가 기능 멤버의 인스턴스를 가지고 시행 것이며, MyFunctionality의 디자인은 기본 클래스에 대한 참조를 기준으로 작동합니다. 그러나 내부 액세스가 필요한 보호 된 구성원이있는 경우에는 작동하지 않을 수 있습니다.

+0

제 3 자 클래스의 인스턴스화를 강제하는 인터페이스는 원하지 않습니다. 서브 클래스의 * one *에 대해서만 이해할 수 있기 때문입니다. –

+0

인터페이스를 구현 한 하위 클래스에서만 구현할 수 있습니다. 내 말은, 당신은 단지 하위 클래스에 "MyFunctionality"타입의 멤버를 추가하고 인터페이스는 사용하지 않을 수 있지만, 인터페이스가 있으면 디자인 의도를 더 잘 표현할 수 있다고 생각합니다. –

관련 문제