ProgramingTip

내부 클래스의 공용 및 내부 멤버?

bestdevel 2020. 12. 1. 19:11
반응형

내부 클래스의 공용 및 내부 멤버?


좋아, 약간 어리석은 질문 일 수 있고 분명한 대답이 여기에서 미묘한 부분을 있는지 궁금했습니다.

클래스 에서 선언 된 멤버 와 클래스 public에서 선언 된 멤버 가시성 / 사용성에서 차이가가 있습니까?internalinternalinternal

즉 사이

internal class Foo
{
    public void Bar()
    {
    }
}

internal class Foo
{
    internal void Bar()
    {
    }
}

메서드를 public선언 한 virtual다음 파생 클래스 인에서 재정의 한 public경우 수정 튼튼하게 사용하는 이유는 분명합니다. 그러나 이것이 유일한 상황입니까?


이 경우를 고려하십시오.

public interface IBar { void Bar(); }
internal class C : IBar
{
    public void Bar() { }
}

여기서 C.Bar는 내부로 표시 할 수 없습니다. 이렇게하면 D.GetBar () 호출자가 C.Bar에 액세스 할 수 있으므로 오류가 발생합니다.

public class D
{
    public static IBar GetBar() { return new C(); } 
}

public멤버는 여전히 internal때의 internal클래스입니다.

MSDN에서 :

멤버의 액세스 가능성은 포함 된 유형의 액세스 가능성보다 클 수 없습니다. 예를 들어 내부 형식으로 선언 된 공용 메서드는 내부 접근성 만 있습니다.

이런 식으로 생각하면 public속성에 액세스 할 수 있습니다 ....? 내가 볼 수없는 수업? :)

이 경우 Eric의 대답은 매우 중요합니다. 인터페이스를 통해 노출되고 직접적으로 영향을 주지 않는 경우 , 상대하는 구성원과 그 상황에있는 경우에만 있습니다.


WPF의 XAML에서 사용할 때 둘 사이 차이점이있는 또 다른 예가 있습니다.

XAML :

<Button Tag="{x:Static vm:Foo+Bar.e1}" />

internal열거 형 코드가 등장합니다.

internal class Foo
{
    internal enum Bar
    {
        e1,
        e2,
    }
}

그러나 놀랍게도 변경하면 public오류가 발생합니다.

internal class Foo
{
    public enum Bar
    {
        e1,
        e2,
    }
}

마지막 예에서는 발생합니다.

MC3064 : 공개 또는 내부 클래스 만 마크 업 내에서 사용할 수 있습니다. 'Bar'유형은 공개 또는 내부가 아닙니다.

안타깝게도이 경우 잘못 설명 할 수 없습니다 public. 내 추측은 "WPF가 그렇게 작동하기 때문에"입니다. 중첩 된 클래스의 수정 유효성을 변경 internal하여 오류를 제거하십시오.


public의 멤버 internal클래스를 재정의 할 수 있습니다. public회원 public조금 더하면 간접적으로 ... 노출 될 수 있으므로 기본 클래스를 사용합니다.


반영에있는 회원이 공개되어 있는지 여부가 중요합니다.

예를 들어 중첩 된 개인 클래스를 WPF 바인딩에 전달할 수도 있으며 바인딩은 평소와 같이 공용 속성에 대해 작동합니다.

참고 URL : https://stackoverflow.com/questions/2564215/public-and-internal-members-in-an-internal-class

반응형