(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.
'Program Tip' 카테고리의 다른 글
내 cabal 패키지는 FUBAR입니다. (0) | 2020.11.28 |
---|---|
파이썬에 상응하는 auto.arima () (0) | 2020.11.28 |
MySQL의 기본 ON DELETE 동작은 무엇입니까? (0) | 2020.11.28 |
"localhost", 호스트 및 포트의 요점은 무엇입니까? (0) | 2020.11.28 |
-g 플래그에도 불구하고 Valgrind가 줄 번호를 표시하지 않음 (Ubuntu 11.10 / VirtualBox에서) (0) | 2020.11.28 |