Program Tip

(C # 7.2) "private protected"한정자의 사용 사례는 무엇입니까?

programtip 2020. 11. 28. 10:18
반응형

(C # 7.2) "private protected"한정자의 사용 사례는 무엇입니까?


C # 7.2에는 private protected modifier가 도입되었습니다 .

저는 항상 속성을 사용하여 필드에 대한 액세스를 보호하여 Get / Set 메서드를 통한 액세스를 허용했습니다. 일반적으로 내 개체의 내부 상태가 내 클래스 이외의 다른 항목에 의해 수정되는 것을 원하지 않기 때문입니다.

C # 언어 팀이이 기능을 추가 한 이유를 이해하려고합니다. Google에서 광범위한 검색을 수행하고 '새로운 소식'미디어를 읽고 시청 한 후에도 (Mads Torgerson보도 자료 , 세부 정보비디오를 봤습니다 ) 여전히 현명하지 않습니다.

나에게 이것은 개발자가 Liskov Substitution 원칙을 어길 수있는 것처럼 보이지만,이 기능이 현재 존재하는 이유를 이해하지 못하기 때문일 수 있습니다.

나는 그것이 어떻게 사용될 수 있는지 이해합니다. 이유는 아닙니다. 누군가 MSDN 문서에서 인위적인 것보다 실제 사용 예제를 제공 할 수 있습니까?


C # 7.2 이전에는 protected internal수정자가 있었습니다 . 이것은 실제로 보호 된 OR 내부를 의미합니다. 즉, 멤버 A가 하위 클래스와 현재 어셈블리의 모든 클래스에 액세스 할 수 있음을 의미합니다. 해당 클래스가 클래스의 하위가 아니더라도 A"보호됨"이 암시하는 제한이 완화됩니다.

private protected실제로 보호되고 내부를 의미합니다. 즉, 멤버는 동일한 어셈블리에있는 자식 클래스에만 액세스 할 수 있지만 어셈블리 외부에있는 자식 클래스에는 액세스 할 수 없습니다 (따라서 "보호됨"에 의해 암시되는 제한이 좁아짐-훨씬 더 제한적입니다). 이는 어셈블리에서 클래스 계층을 작성하고 다른 어셈블리의 자식 클래스가 해당 계층의 특정 부분에 액세스하는 것을 원하지 않는 경우에 유용합니다.

Jon Skeet 이 주석에서 제공 한 예를 들어 볼 수 있습니다 . 수업이 있다고 가정하십시오.

public class MyClass {

}

그리고 현재 어셈블리에서만 상속 할 수 있기를 원하지만이 클래스 계층 구조 내에서를 제외하고는이 클래스를 직접 인스턴스화하는 것을 허용하지 않으려 고합니다.

내부 생성자를 사용하여 현재 어셈블리 내에서만 상속 할 수 있습니다.

public class MyClass {
    internal MyClass() {
    }
}

보호 된 생성자를 사용하여 현재 클래스 계층 구조를 제외하고 직접 인스턴스화를 방지 할 수 있습니다.

public class MyClass {
    protected MyClass() {
    }
}

그리고 둘 다 얻으려면 private protected생성자 가 필요합니다 .

public class MyClass {
    private protected MyClass() {
    }
}

SomeHelper공용 추상 기본 클래스 구현의 일부로 사용하려는 내부 클래스가 있다고 가정합니다 .

public abstract class Test
{
    // Won't compile because SomeHelper is internal.
    protected SomeHelper CreateHelper()
    {
        return new SomeHelper();
    }

    public int Func(int x)
    {
        var helper = CreateHelper();
        return helper.DoSomething(x);
    }
}

internal class SomeHelper
{
    public virtual int DoSomething(int x)
    {
        return -x;
    }
}

내부 유형을 반환하는 보호 된 메서드를 가질 수 없기 때문에 컴파일되지 않습니다. 당신의 유일한 SomeHelper방법은 그런 식으로 사용하지 않거나 SomeHelper공개하는 것입니다.

( SomeHelper의 보호 된 내부 클래스를 만들 수 Test있지만 SomeHelper기본 클래스에서 파생되지 않는 다른 클래스에서 사용하도록 의도 된 경우 작동 하지 않습니다.)

private protected기능 의 도입으로 다음 CreateHelper()과 같이 선언 할 수 있습니다 .

private protected SomeHelper CreateHelper()
{
    return new SomeHelper();
}

Now it will compile, and you don't have to expose your internals.


For two-word access modifiers I have this concept - the first accessor is related to another assembly, the second one to that assembly in which it was defined.

protected internal

  • protected in another assembly: accessible only in the child classes.

  • internal in the current assembly: accessible by everyone in the current assembly.

private protected

  • private in another assembly: is not accessible.
  • protected in the current assembly: accessible only in the child classes.

참고URL : https://stackoverflow.com/questions/47430491/what-is-the-use-case-for-the-c-7-2-private-protected-modifier

반응형