문제

었 refactoring codebase 의 프로젝트는 나는 현재에도록 클래스/인터페이스는 사용되지 않의 경계를 뛰어넘어 어셈블리로 선언해야 합 내부(보 공개).로 문제는 다음과 같은 코드:

internal interface IFirstInterface
{
    ...
}

internal interface ISecondInterface
{
    IFirstInterface First{ get; }
    ...
}

public class Implementer : ISecondInterface
{
    public IFirstInterface First {get; private set;}
    ...
}

나의 질문:

  1. 왜 구성원의 내부 인터페이스가 공개적으로 실행하고 있습니까?인터페이스를 구현하는 경우에는 내부 클래스,안 구현 구성원 내부?이것은 큰 문제는 이 인터페이스 구성원이 될 수 없 공개적으로 액세스할 수 있는 어쨌든,주어진 클래스가 내부에 있습니다.그것은 단지 카운 직관적입니다.

  2. 주요 문제는 시나리오를 때문에 위에 나는 가질 수 없는 공개에 대한 게터 IFirstInterface 때문에 그것은 의도적인 내부 인터페이스,즉나는 다음과 같은 오류가에서는 컴파일러:

일관성 접근성:성 형'IFirstInterface'덜 액세스할 수 있다는 시설 '구현.첫 번째'

어떤 방법이 이것을 이용할 수 있을까요?

참고:내가 있다는 것을 실현은 아마도 작은 값에서 이 리팩터링 운동을 하 나는 것이라고 생각하는 좋은 방법이 나를 이해하기 위해 더 깊이의 의미 내부 수 있게 되었습니다.

도움이 되었습니까?

해결책

그냥 참고 - 실제로 제공 한 코드 하다 컴파일 때문에 Implementer 내부 클래스입니다. 문제는 언제옵니다 Implementer 공개적입니다.

이것을 반올림하는 방법은 명시 적 인터페이스 구현을 사용하는 것입니다.

public class Implementer : ISecondInferface
{
    private IFirstInterface first;
    IFirstInterface ISecondInterface.First { get { return first; } }
}

세터를 정의하지 않는 인터페이스를 명시 적으로 구현하기 때문에 세터를 가질 수 없습니다. 너 ~할 수 있었다 대안으로 이것을 수행하십시오.

public class Implementer : ISecondInterface
{
    internal IFirstInterface First { get; private set; }
    IFirstInterface ISecondInterface.First { get { return First; } }
}

내부 인터페이스에 공개 구성원이 있다는 것은 불행한 일입니다. 이와 같은 것을 복잡하게 만듭니다. 공개 인터페이스가 내부 멤버를 갖는 것은 이상합니다 (내부는 무엇입니까?

다른 팁

왜 구성원의 내부 인터페이스가 공개적으로 실행하고 있습니까?

를 정의할 때 인터페이스를 정의하지 않은 액세스 수준 구성원에 대 한,이후의 모든 인터페이스 구성원 public.는 경우에도 인터페이스 등 internal, 회원들은 여전히 고려 public.할 때는 암시적의 구현은 회원의 서명이 일치해야 합니다,그래서 그것은야 public.

에 대한 노출 getter,는 것이 좋기 명시적 인터페이스의 구현 대신에,그리고 만들기 internal 제공하는 노출의 가치:

internal IFirstInterface First { get; private set; }

IFirstInterface ISecondInterface.First
{
    get { return this.First; }
}

이 게시물은 몇 살이되었지만 공개 클래스에서 내부 인터페이스를 구현할 수 있다는 점에 주목할 가치가 있다고 생각합니다. 다음 링크를 참조하십시오.

http://forums.create.msdn.com/forums/p/29808/167820.aspx
http://msdn.microsoft.com/en-us/library/aa664591%28vs.71%29.aspx

첫 번째 링크의 예 :


internal interface ISecretInterface
{
    string Property1 { get; }
}

public class PublicClass : ISecretInterface
{
    // class property
    public string Property1
    {
        get { return "Foo"; }
    }

    // interface property
    string ISecretInterface.Property1
    {
        get { return "Secret"; }
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top