嗯,我正在学习斯卡拉所以这个问题可能是对大多数人来说太简单了。
在Java中,我可以在一个类的静态插槽(函数或变量),然后我将在继承类,插槽了。
在斯卡拉我没有静态时隙,但我有伴侣的对象。 但我发现自己的这些对象不继承类的一部分,所以如果我有两班Person
及Student
,和人有同伴对象具有可变all:List
返回所有人员的名单,所以我可以做Person.all
,我期待,我可以做Student.all
太多,但事实并非如此。
有没有什么办法让我会得到在java中相同的行为?
谢谢!
从理论上说,Java的在这方面的行为是很破的。 子类继承静态成员的事实确实没有从一个角度面向对象的点任何意义。 静真的无非是看中多,范围的全局。 继承是你在类级别看到的东西,但静真的不是在类级别(因为他们是全球),所以继承权不应适用。 它确实在Java中的事实......令人不安。
斯卡拉已真正实现了在该部门的高端路线; 东西我们都应该感谢。 作为另一个答复中提到,要定义正确的方法“继承”静是在继承的成员提取出来为特征:
trait Inherited {
def foo() { ... }
def bar(i: Int) = ...
}
class Person {
...
}
object Person extends Inherited
class Student extends Person {
...
}
object Student extends Inherited
这似乎是不必要比Java更详细,但相信我,当我说,语义,结果少了很多令人惊讶。
我不知道这是你的意思,但同伴对象可以从一些特质/类扩展:
class Person
class Student extends Person
trait Aggregation[T] {
val all: List[T]
}
object Person extends Aggregation[Person] {
val all: List[Person] = List(new Person, new Person)
}
object Student extends Aggregation[Student] {
val all: List[Student] = List(new Student, new Student)
}
println(Person.all) // prints all persons
println(Student.all) // prints all students
Scala的对象是不是类级别的实体,如静是Java。 他们只是一个类定义和单实例集于一身。
一个同伴对象是允许它和它的同伴类之间的私人数据的共享一个特例。
对象可以扩展类,而不是其他对象。 所有的“对象”后,仅仅是一个单一实例 - 一个“对象”的类定义是隐藏的。
它是合理的期望伴侣对象和同伴类之间的特殊关系到项目上的同伴对象一个附加的类层次结构?
我猜想,实现人与学生之间的依赖关系是委托的最佳方式。
object Person { val all = List(1,2,3) }
object Student { val all = Person.all.filter(_ % 2 == 0) }
AFAICS,丹尼尔Spiewak的和沃尔特昌的回答似乎提供的两个单独的副本all
名单。 我没有测试以下,但我希望这甚至提供了它,如果有错误,正确的轮廓。
class Person
class Student extends Person
object Person {
val all: List[Person]
}
然后内Student
,通过访问Person.all
如果你想通过提供接入Student.all
然后
object Student {
def all() = Person.all
}
另一种方式来做到这一点,将允许你在一个特质声明静态(即单独的对象)被继承。
trait StaticAll {
object Static { val all: List[Person] }
}
class Person extends StaticAll
class Student extends Person
然后用访问StaticAll#Static.all
。 我认为这是正确的,而不是StaticAll.Static.all
。 再次,这是所有从我的头顶,我没有测试任何这一点。 请纠正我的错误。