class TestClass
{
private string _privateString = "hello";
void ChangeData()
{
TestClass otherTestClass = new TestClass();
otherTestClass._privateString = "world";
}
}
이 코드는 C# 및 PHP와 동등한 작업으로 컴파일되지만 누군가 otherTestClass._privateString
을 여기서 바꿀 수있는 이유를 설명 할 수 있습니까?private 멤버 변수를 클래스 인스턴스별로 변경할 수있는 이유는 무엇입니까?
클래스의 인스턴스가 어떤 상황에서도 개인 멤버 변수를 변경할 수 없어야하고 otherTestClass._privateString
에 액세스하려는 경우 '보호 수준으로 인해 액세스 할 수 없음'오류가 발생한다고 생각했을 것입니다.
그렇다고해서 개인 클래스에 개체를 인스턴스화하면 개인 멤버에 액세스 할 수 있습니까? 그리고 이것이 캡슐화를 어느 정도 깨뜨리지는 않을까요? 또는 나는 명백한 것을 놓치고 있는가?
- (위 클래스의 디자인은 단지 뒤에 이론에 대해 궁금 좋은 방법입니다 있을지 물어 아니에요.)
편집 - 답변과 의견을 주셔서 감사합니다. 명확히하기 위해, 나는 이것을 수행 할 수 있는지 여부가 긍정적 인 특징으로 간주되는지 또는 대부분의 다른 언어가 그렇게하거나 다른 방식으로 수행하기 때문에 더 나은 컴파일 타임 검사/코드 명확성을 위해 필요한 절충안인지에 관심이 있습니다. 필자는 컴파일러가이 문제를 방지하거나 경고하지만, 언어 디자이너와는 거리가 멀다는 것이 이상적입니다. 이 방법으로 어떤 방법을 사용하면 어렵거나 불가능할 유용한 유용한 작업을 캡슐화를 위반하지 않고 수행 할 수 있습니다.
BTW :'ChangeData()'를'static'으로 만들 수도 있습니다. 그러면 여전히 개인용 멤버에 액세스 할 수 있습니다. – ulrichb
@ulrichb -'ChangeData()'가'static' 인 경우 private 멤버에 액세스하기 위해'this' 키워드를 사용할 수 없다는 OP에 유의해야합니다. – TheCloudlessSky
Ruby에서 다른 언어의 예로서 public은 동일하지만 private은 "동일한 인스턴스에서만 액세스 가능"을 의미하며 protected는 "같은 클래스에서만 액세스 가능"을 의미합니다. 상속은 거기와 아무 상관이 없습니다. – Tesserex