2012-04-18 6 views
3

나는 비공개로 동반자 객체 코드와 정의 된 생성자가 : 같은 패키지의 다른 개체가이 개인 생성자에 액세스 할 수있는 이유스칼라 개인 액세스 한정자 범위

class Person private[Person] (var age: Int, var name: String) { 
    private[Person] def this(name: String) = this(0, name) 
} 

private class Employee(age: Int, name: String) extends Person(age, name) 

private class Worker(age: Int, name: String) extends Person(age, name) 

object Person { 
    def prettyPrint(p: Person) = println("name:%s age:%s".format(p.name, p.age)) 
    def apply(age: Int, name: String) = new Person(age, name) 
    def apply() = new Person(0, "undefined") 
    def apply(age: Int, name: String, personType: String): Person = { 
    if (personType == "worker") new Worker(age, name) 
    else if (personType == "employee") new Employee(age, name) 
    else new Person(age, name) 
    } 

} 

내 질문입니다. 나는 다른 사람들이 그곳에 접근 할 수 없지만 동반자도 가질 수 없도록 비공개 [this]를 추가했다. 클래스 및 컴패니언 오브젝트에 대해서만 사유 속성을 가질 수 있습니까?

+0

생성자가 클래스에 의해 호출 되었기 때문에 그렇지 않아서 올바른 것입니다. 어쩌면 결과 클래스를 반환하는 private 함수를 만들어야합니다. –

+0

@Lukasz 예제에서'private' 수정자는 속성이 아닌 생성자에 적용됩니다. 정말로 생성자에 대한 호출을 제한 하시겠습니까, 아니면 private 필드 만 갖고 싶습니까? – paradigmatic

+2

'private class Employee (age : Int, name : String) extends Person (age, name)'은 2.9.1에서 컴파일러를 사용합니다. 축하해! –

답변

1

이 코드는 컴파일되지 않습니다. EmployeeWorker은 모두 개인 생성자에 액세스하려고 시도하며 액세스가 정당하게 거부되었습니다.

귀하의 질문은 개인 변수를 말하지만 개인으로 선언 된 변수는 없습니다.

예가 불완전하거나 잘못되었습니다. 우리가 질문에 대답 할 수 있도록 예제를 수정하십시오.

+0

감사합니다. 피곤 했었습니다. 물론 생성자를 의미했습니다. – Lukasz

+0

좋아요. 문제는 마무리에서 멈추는 컴파일러 버그로, Eclipse에서 괜찮아 보였습니다. 전혀 컴파일하지 마라. – Lukasz