2012-09-10 3 views
8

방금 ​​전에 깨닫지 못했던 것을 발견했습니다. 이 클래스는 C#에서 유효 함이 밝혀졌습니다.같은 클래스의 다른 인스턴스에서 액세스 할 수있는 개인 회원

그래서 같은 클래스의 서로 다른 인스턴스가 서로의 개인 멤버에 액세스 할 수 있습니다.

지금까지 개체의 전용 멤버는 같은 클래스의 다른 인스턴스가 아닌 해당 개체에서만 액세스 할 수 있다고 생각했습니다. 이 사실을 알아내는 것은 조금 놀랍습니다.

모든 공통 객체 지향 언어의 경우입니까? 나에게 직관적이지 않습니다.

+0

이미 비슷한 질문을 한 사람이 있습니다. http://stackoverflow.com/questions/346127/access-private-member-variable-of-the-class-using-its-object-instance?rq= 1 . 그러나이 설계 선택에 대한 정당한 이유는 그 설계에 대한 해답이 아닙니다. 다르게 일하는 것이 비효율적이거나 불가능하기 때문입니까? – Oliver

답변

8

이것은 C++ 및 Java와 동일합니다. 액세스 제어는 오브젝트 단위가 아닌 클래스 단위로 작동합니다.

C++에서 Java 및 C# 액세스 제어는 정적 인 컴파일 타임 기능으로 구현됩니다. 이렇게하면 런타임에 오버 헤드가 발생하지 않습니다. 클래스별로 컨트롤 만 그런 식으로 구현할 수 있습니다.

+1

왜 이런 경우입니까? 컴파일러는 (암시 적 또는 명시 적)'this' 참조 이외의 다른 것에 대해서 private 메소드를 호출하는 것을 금지 할 수 없습니까? 개인 메서드가 'this'를 참조하는 다른 변수에 호출 될 수 없다는 것을 의미합니다. 그러나이 메서드의 단점은 없습니다. japreiss의 대답이 더 정확하다고 생각합니다. – herman

11

공용 메서드를 통해 내부 상태를 모두 노출시키지 않는 클래스의 복사 생성자는 어떻게 만들겠습니까?

는 다음과 같이 생각해

class Car 
{ 
public: 
    void accelerate(double desiredVelocity); 
    double velocity() const; 
private: 
    Engine myEngine; 
}; 

Car의 공용 인터페이스가 Engine를 노출하지 않습니다,하지만 당신은 사본을 확인해야합니다.

+0

예; 이. 복사/복제 방법을 만드는 다른 괜찮은 방법이 없을 것입니다. 어셈블리 또는 뭔가 외부에서 어떻게 든 액세스 할 수 있는지 염려한다면 내부를 보호 할 수 있습니다. – Nikki9696

+0

equals()를 구현하는데도 필요합니다. – herman

관련 문제