2009-09-11 2 views
4

변경할 수없는 기존 타사 클래스에 인터페이스를 삽입 할 수 있습니까? 확장 메소드와 같지만 인터페이스 (및 주입 된 클래스에 대한 구현).인터페이스 삽입

필자는 두 라이브러리에서 동일한 인터페이스와 비슷한 클래스를 제공함으로써 두 개의 유사한 타사 라이브러리 중 하나를 선택적으로 사용하는 것을 좋아합니다. 그래서 나는 수업을 나의 것으로 바꿀 필요가 없다.

+1

나도이 싶네요. 나는 그것에 대해 잠시 뒤로 블로그를 보냈다. http://www.madprops.org/blog/imposing-interfaces-onto-classes-with-extension-methods/ –

+0

클래스가 사실대로 인터페이스를 적용 할 수 없다는 것은 정말 수치스러운 일이다. 하스켈에서 타입과 타입 클래스로 수행된다. –

답변

3

인터페이스 삽입에 대한 의미를 완전히 이해하지 못했지만이를 달성하기 위해 Adapter 패턴을 사용할 수 있습니다. 또한 : http://dofactory.com/Patterns/PatternAdapter.aspx

자신의 인터페이스를 만든 다음 제 3 자 클래스를 포함/감싸는 인터페이스를 구현하는 고유 한 클래스를 만듭니다.

1

인터페이스를 다루는 한, 인터페이스를 구현하는 자신의 클래스에서 클래스를 래핑하는 것이 좋은 이유는 무엇입니까?

0

구성을 기준으로 클래스를 확장 할 수있는 Decorator Pattern을 확인해야합니다.

InterfaceA 형을 구현 감안할 때 봉인 클래스 A :

public interface InterfaceA 
{ 
    int A {get; set;} 
} 

public sealed Class A : InterfaceA 
{ 
    public int A {get;set;} 
} 

당신은 InterfaceA 형을 확장하고 클래스 A의 인스턴스를 캡슐화 및 추가 방법을 제공하기 위해 장식 클래스 B를 사용할 수 있습니다.

public interface MyExtendedInterfaceA : InterfaceA 
{ 
    int B {get;set} 
} 

public class B : MyExtendedInterfaceA 
{ 
    private InterfaceA _implementsA = new A(); 

    public int A 
    { 
     get 
     { 
      return _implementsA.A; 
     } 
     set 
     { 
      _implementsA.A = value; 
     } 
    } 

    public int B {get; set;} 
} 

또는 장식 클래스 C는 완전히 새로운 인터페이스를 추가 할 수 있습니다

public interface InterfaceC 
{ 
    int MethodC(); 
} 

public class C : InterfaceA, InterfaceC 
{ 
private InterfaceA _implementsA = new A(); 

    public int A 
    { 
     get 
     { 
      return _implementsA.A; 
     } 
     set 
     { 
      _implementsA.A = value; 
     } 
    } 

    public int MethodC() 
    { 
     return A * 10; 
    } 
} 
+0

내 질문을 신중하게 읽지 않은 것 같습니다. 클래스 A가 타사 라이브러리 클래스 중 하나라면 InterfaceA를 추가 할 수 없습니다. – Martin

+0

내가 의미했던 것을 잘못 해석 한 것 같습니다. 나는 당신 자신의 코드 나 제 3 자 라이브러리에있을 수있는 클래스 A 구조를 개략적으로 설명했다. 어느 쪽이든, 그것은 봉인되어 있으며 변경할 수 없습니다. 클래스 B와 C는 사용자가 자신의 클래스에 작성하는 코드입니다. –