2009-05-05 2 views
2

나는 Test Driven Development: By Example을 통해 읽고 있는데, 예제 중 하나가 나를 괴롭 히고 있습니다. 다음 장에서, 그런테스트 구동 개발 예제 예제 작성자 : Kent Beck

public boolean equals(Object object) 
{ 
    Dollar dollar= (Dollar) object; 
    return amount == dollar.amount; 
} 

: 제 3 (전체 평등)에서, 저자는 Dollar 클래스에 equals 함수 두 Dollar 오브젝트를 비교 생성 (4 개인), 그 양을 전용 부재를 만든다 달러 수업.

private int amount; 

및 테스트가 통과했습니다. 이로 인해 다른 Dollar 객체의 amount 멤버에 액세스하는 것이 제한되어 있으므로 객체가 자신의 amount 멤버에 액세스 할 수 있기 때문에 equals 메서드에서 컴파일러 오류가 발생하지 않아야합니까?

//shouldn't dollar.amount be no longer accessable? 
return amount == dollar.amount 

근본적으로 오해 나는 private입니까?

나는 돌아 가기로 결정하고 수동으로 책과 함께 코드와 UPDATE 나는 다음 부분 (제 6 장 - 모두를위한 평등, 돌아 오는)에 도착했을 때 그들은 부모 클래스로 양을 밀어하고 보호 만든다

public class Money 
{ 
    protected int amount; 
} 

public class Dollar : Money 
{ 
    public Dollar(int amount) 
    { 
     this.amount = amount; 
    } 
    // override object.Equals 
    public override bool Equals(object obj) 
    { 
     Money dollar = (Money)obj; 
     //"error CS1540: Cannot access protected member 'Money.amount' 
     // via a qualifier of type 'Money'; the qualifier must be of 
     // type 'Dollar' (or derived from it)" on the next line: 
     return amount == dollar.amount; 
    } 
} 

이이 protected는 C#으로 인스턴스를 기반으로한다는 뜻 : 나는 액세스 문제 받고 있어요?

+0

나는이 책을 읽지 않았지만 그가 금액 회원에게 공개적으로 접근 할 수있는 부동산을 만들었을 가능성이 있습니까? – TheTXI

+0

@TheTXI : Java에는 속성이 없습니다. 정확한 변경은 package-private 필드 ('int amount;')로 사용되는 양과 private 필드 ('private int amount;')로 변경되었습니다. (저는 Kent가 공용 대신 책에서 package-private을 사용하는 이유를 모르겠습니다. 자바 언어의 자세한 정보를 줄이고 주요 요점에 초점을 맞추는 것일 수도 있습니다.) –

답변

7

네, 근본적으로 오해의 소지가 있습니다. 프라이버시는 특정 인스턴스가 아닌 클래스 별입니다.

+0

인스턴스 별 개인 정보가 존재합니까? – brian

+0

나는 어떤 언어로도 익숙하지 않다. –

+1

스칼라에서 object-private가 있습니다. 내 대답은 http : // stackoverflow를 참조하십시오.com/questions/826592/벙어리 - 질문 -에 - 예제 -에서 - 테스트 주도 개발 - by-by-kent-beck/826638 # 826638 –

3

근본적으로 비공개인데, 달러는 동일한 클래스 인 경우 달러 비공개 메소드에 액세스 할 수 있습니다.

+0

답변을 읽은 후 궁금한 점이 있습니다. 근본적으로 사적인 오해가 있습니까? – Pesto

3

수정 자 개인은 개인 - 개인, 개인 - 개체가 아닙니다.

2

C++ 계열 (C++, Java, C#)의 언어에서 액세스 제어는 클래스 수준에서만 수행됩니다. 따라서 private은 해당 클래스의 모든 인스턴스에 대한 액세스를 허용합니다.

스몰 토크 개인 정보 보호 정책의 IIRC는 예상대로 작동합니다.

3

Java의 경우 private은 class-private를 의미합니다. 클래스 내에서 클래스의 모든 인스턴스에서 해당 필드에 액세스 할 수 있습니다.

스칼라에는 개체 전용 범위 인 private[this]이 있습니다. 또한 다른 측면에서 스칼라의 범위는보다 유연합니다 (자세한 내용은 this article 참조).

그러나 Java에서는 개체 - 개인 범위가 없습니다.