2012-04-18 49 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) 
    } 

} 

我的问题是,为什么在同一个包装的另一个对象还可以访问这一私有的构造函数。我添加了私人[这个],所以其他人无法访问它,但也没有同伴。我可以只有类和伴侣对象的私有属性吗?

+0

是不是因为构造函数是由类调用的,所以它是正确的。也许你应该创建一个返回结果类的私有函数。 – 2012-04-18 15:02:53

+0

@Lukasz在你的例子中,'private'修饰符适用于构造函数,而不适用于属性。你真的想限制调用构造函数还是只有私人领域? – paradigmatic 2012-04-18 15:59:37

+2

'私人类员工(年龄:国际,名称:字符串)扩展人(年龄,名称)'slay在2.9.1编译器。恭喜! – 2012-04-18 19:05:44

回答

1

此代码不能编译。 EmployeeWorker都尝试访问私有构造函数,并正确拒绝访问。

你的问题提到一个私有变量,但没有变量声明为私有变量。

因此,您的示例不完整,或者不正确。请更正例子,以便我们回答问题。

+0

谢谢我累了,我的意思是构造函数当然:) – Lukasz 2012-04-23 21:30:11

+0

好吧,所以问题是编译器的bug,阻止它完成,所以我在Eclipse中看起来确定,而它没有根本不会编译。 – Lukasz 2012-04-23 21:31:12