2014-12-03 2 views
0

두 공유 클래스에 대한 세부 정보를 공개하지 않고 두 클래스의 구현을 공유하는 방법을 찾고 있습니다. C에서 두 클래스 사이에 개인 구현 공유

  • 공용 클래스 MyImplA하는 MyInterface : MyCommonImpl
  • 공용 클래스 MyImplB :

    • 공용 인터페이스하는 MyInterface
    • 클래스 MyCommonImpl :이 기본 클래스 구조를 만들기 위해 기대했다 MyCommonImpl

    MyCommonImpl 구현을 MyInterface의 기능을 가지며 MyImplAMyImplB에 제공된 하나의 추상 기능을 가지고 있습니다. MyImplA의 사용자는 어떤 식 으로든 MyCommonImpl에 대해 알지 않아야합니다. 그것은 단지 암시 적 세부 사항입니다.

    필자는 수동 합성 작업을 고려해 보았지만 기능을 전달하기 위해 많은 코드를 복사해야했습니다. MyCommonImpl에 구현 된 이벤트가 있으며 매개 변수 중 하나가 sender이므로 문제가 있습니다. 프록시 처리기를 넣고 부분적으로 이벤트를 다시 작성해야합니다. 기본적으로 전체 MyCommonImpl을 복사하여 붙여 넣는 것보다 더 많은 코드가 필요합니다.

    많은 코드를 복제하지 않고 어떻게 할 수 있습니까?

  • +2

    ; 질문에 제시된 디자인은 완전히 의미가 있습니다. MyImplA와 MyImplB에'MyCommonImpl'을 숨긴 이유는 무엇입니까? – Codor

    +0

    우리는 모듈에'MyCommonImpl'을 노출하고 싶지 않습니다. 즉, 라이브러리의 사용자는 공용 인터페이스의 일부가되므로 라이브러리를 보지 않아야합니다. 위에서 설명한 작업을 실제로 수행 할 수 없다는 것을 알고 있으므로 공용 클래스에 대한 상속을 위해 개인 기본 클래스를 사용하십시오. –

    +0

    상속을 사용하지 않고 구성을 사용하십시오. [위키 백과 : 상속을 통한 작문] –

    답변

    0

    인터페이스와 구현을 다른 어셈블리로 옮기고 내부에 표시하여 MyCommonImpl의 추상 함수를 숨길 수 있습니다. 더 나아가 MyImplA에서 public으로 선언 된 메서드 만 표시되도록 호출자에서 메서드를 완전히 숨길 수 있도록 해당 어셈블리 내부에 인터페이스를 명시 적으로 구현할 수 있습니다.

    명시 적 구현을위한 내부 캐스트는 별도의 어셈블리에

    ...하지만 조금 불쾌한입니다 : 내가 꽤 질문을 이해하지

    namespace Private 
    { 
        internal interface IMyInterface 
        { 
         void InterfaceMethod(); 
        } 
    
        public abstract class MyCommonImpl : IMyInterface 
        { 
         internal MyCommonImpl() 
         { 
          // internal ctor to stop callers constructing 
         } 
    
         void IMyInterface.InterfaceMethod() 
         { 
          Console.WriteLine("InterfaceMethod"); 
         } 
    
         internal abstract void CommonAbstract(); 
        } 
    
        public class MyImplA : MyCommonImpl 
        { 
         internal override void CommonAbstract() 
         { 
          ((IMyInterface)this).InterfaceMethod(); 
          Console.WriteLine("CommonAbstract"); 
         } 
    
         public void ImplAMethod() 
         { 
          CommonAbstract(); 
          Console.WriteLine("ImplAMethod"); 
         } 
        } 
    } 
    
    관련 문제