2011-11-14 1 views
0

기본 구현 Foo를 제공하려는 인터페이스 IFoo가 있습니다. Foo는 IFoo를 구현하는 다른 클래스에서 포함 된 클래스/구성 요소로 사용할 수 있습니다.포함 된 구성 요소로 사용되는 인터페이스의 기본 구현

IFoo는 Foo에 대한 호출을 전달하여 대부분 구현하는 여러 클래스에서 사용하지만 일부 메소드의 경우 자체 구현을 제공 할 수 있습니다.

Foo는 호출 클래스의 (개인) 멤버에 액세스해야합니다.

IFoo 인터페이스의 일부가 아니기 때문에 이러한 멤버를 메서드 호출에서 인수로 전달할 수 없습니다.

이러한 목적으로 만 이러한 멤버에게 공개 속성을 제공하면 호출 클래스의 인터페이스가 지나치게 복잡해 지므로 바람직하지 않습니다.

질문 : Foo에 이러한 멤버에 대한 액세스 권한을 부여하는 좋은 디자인 또는 일반적으로 어떻게 달성됩니까? 이것에 대한 알려진 디자인 패턴이 있습니까?

EDIT : 상속은 IFoo를 구현하는 클래스가 같은 클래스에서 상속 할 수 없기 때문에 옵션이 아닙니다.

답변

1

당신이 말하는 상속은 없습니까? 따라서 기본적으로 Foo 클래스는 IFoo를 구현할 필요가 없으며 IFoo를 쉽게 구현해야합니다. 왜 메소드에 매개 변수를 추가 할 수 없습니까? 다음과 같은 것 :

자, 보겠습니다.

interface IFoo 
{ 
    void DisplayTime(); 
} 

그리고 당신의 FooImplHelper (그것이 당신의 경우에 의미가 있다면 바로이 예제의 목적을 위해 정적 만든, 내가 여부를 모르는) : 제가이 권리를 가지고 있는지 확인하기 위해 몇 가지 방법을 만들어 보자

public static FooImplHelper 
{ 
    public static void DisplayTime(int UTFOffiset) 
    { 
     Console.WriteLine(DateTime.UtcNow + TimeSpan.FromHours(UTFOffset)); 
    } 
} 

과 의미를 구현

public class MyClock: BaseClock, IFoo 
{ 
    public void DisplayTime() 
    { 
     FooImplHelper.DisplayTime(2); 
    } 
} 

않습니다 IFoo? 그렇지 않다면 더 많은 정보를 제공해야합니다.

Itay,

+0

IFoo를 구현하는 클래스가 같은 클래스에서 상속받을 수 없기 때문에 상속을 선택할 수 없습니다. 이것은 다중 상속 상황입니다. – Peladao

+0

수정 됨. 나는 희망. – zmbq

+0

이것은 사실 내가 생각하고 실제로 상당히 일반적으로 보이는 대안 중 하나입니다. 그러나 기본적으로 기본 구현으로 사용되지만 도우미 클래스가 인터페이스를 사용하지 않기 때문에 매우 세련된 방법은 아닙니다. 그러나 그것을 설명해 주셔서 감사합니다. – Peladao

0

또 다른 가능성은, 당신은 하나를 요구하기 때문이다. 나는 첫 번째 것을 선호한다.

두 번째 인터페이스 정의 :

interface IFooImplHelper 
{ 
     int UTFOffset { get; } 
} 

을이처럼 FooImpl 클래스 모습합니다

class FooImpl: IFoo 
{ 
     private IFooImplHelper _helper; 

     public FooImpl(IFooImplHelper helper) 
     { 
      _helper = helper; 
     } 

     public void DisplayTime() 
     { 
      Console.WriteLine(DateTime.UtcNow + TimeSpan.FromHours(_helper.UTFDifference); 
     } 
} 

당신의 클라이언트가 IFoo 인터페이스 (포워딩 FooImpl 호출)와 모두를 구현해야합니다 IFooImplHelper 인터페이스. 나는 그들 중 누구도 추가 작업을 고맙게 생각하지 않을 것이라고 생각합니다 ...

Itay.

+0

그래, 나는이 라인을 따라 (일종의) 그래도 클라이언트에게 여분의 인터페이스를 광고하고 싶지는 않지만 생각했다. 지금은 'int UTFOffset'을 IFoo 인터페이스에 추가하려고합니다. (처음에는 그다지 좋지 않았지만) 첫 번째 솔루션을 사용합니다. (보너스 포인트는 양손으로 프로와 콘을주고있는 사람을위한 것입니다!) – Peladao

+0

아니요, 해당 인터페이스를 사용하는 코드에 아무런 의미가없는 경우 인터페이스에 오프셋을 추가하지 마십시오. 그게 당신의 인생을 더 쉽게 사용자의 희생으로 만들 수 있습니다 ... – zmbq

+0

당신 말이 맞아. – Peladao

1

구현 메소드 서명을 인터페이스 메소드 서명과 동일하게 선언 할 이유가 없으므로 인수를 자유롭게 전달할 수 있어야합니다.예를 들어 : 또는

interface IFoo { 
    void MyMethod(); 
} 

static class FooImp { 
    public static void MyMethodImp(object private_object) { 
     // ... 
    } 
} 

class MyFoo : IFoo { 
    public void MyMethod() { 
     FooImp.MyMethodImp(m_PrivateObject); 
    } 
    object m_PrivateObject; 
} 

, 당신은 단지 구현 클래스 사용 조성 개인 객체를 기억할 수 : C 번호는 클래스 다중 상속을 지원하지 않을 경우

물론
interface IFoo { 
    void MyMethod(); 
} 

static class FooImp { 
    public FooImp(object private_object) { 
     m_PrivateObject = private_object; 
    } 
    public void MyMethodImp() { 
     // Use the m_PrivateObject somehow. 
    } 
    readonly object m_PrivateObject; 
} 

class MyFoo : IFoo { 
    public MyFoo() { 
     m_PrivateObject = ... ; 
     m_FooImp = new FooImp(m_PrivateObject); 
    } 
    public void MyMethod() { 
     m_FooImp.MyMethodImp(); 
    } 
    object m_PrivateObject; 
    readonly FooImp m_FooImp; 
} 

이, 이상적인 솔루션이 될 것이다 단지 인터페이스이지만, 슬프게도 그렇지 않습니다.

+0

두 번째 경우에 FooImp가 IFoo를 구현하지 않는 이유는 메서드 서명이 이제 동일하기 때문에? – Peladao

+0

@Peladao 목적이 없으므로'FooImp'는'IFoo'로 접근 할 수 없으며 다른 클래스 (예제에서는 보이지 않지만 원래 게시물에 언급되어 있음)에서 상속되므로'MyFoo'에 의해 상속 될 수 없습니다. –

+0

@Peladao 또한 두 가지 방법을 조합하여 사용할 수도 있으므로 FooImp가 IFoo와 완벽하게 호환되지 않을 수도 있습니다. –

관련 문제