2012-04-18 17 views
3

私はプライベートとしてコンパニオンオブジェクトを持つコードと定義されたコンストラクタを持っている:同じパッケージ内の別のオブジェクトもこのプライベートコンストラクタへのアクセス権を持っている理由Scalaのプライベートアクセス修飾子のスコープ

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'修飾子はプロパティではなくコンストラクタに適用されます。あなたは本当にコンストラクタへの呼び出しを制限したいのですか、またはプライベートフィールドを持っていますか? – paradigmatic

+2

'private class Employee(age:Int、name:String)extends Person(age、name)'は、コンパイラを2.9.1で動作させます。おめでとう! –

答えて

1

このコードはコンパイルされません。 EmployeeWorkerの両方がプライベートコンストラクタにアクセスしようとし、アクセスが正当に拒否されます。

あなたの質問にはプライベート変数がありますが、privateと宣言された変数はありません。

あなたの例は不完全であるか、または間違っています。この例を修正して、質問に答えることができます。

+0

私は疲れていました。私はもちろんコンストラクタを意味していました:) – Lukasz

+0

問題はコンパイラのバグで終了してしまいます。全くコンパイルしないでください。 – Lukasz