Dam*_*ian 7 inheritance static scala
好吧,我正在学习Scala所以这个问题可能对大多数人来说太基本了.
在Java中,我可以在类中有一个静态槽(函数或变量),然后我也将在继承的类中使用该槽.
在Scala我没有静态插槽,但我有伴侣对象.但我发现自己的这些对象不继承类的一部分,所以如果我有两个类Person和Student,以及人与变量的同伴对象all:List返回所有的人的名单,所以我可以做的Person.all,我期待的是我也可以这样做Student.all,但事实并非如此.
有没有办法获得我在java中获得的相同行为?
谢谢!
Dan*_*wak 14
从理论上讲,Java在这方面的行为非常破碎.从面向对象的角度来看,子类继承静态成员的事实确实没有任何意义.静态只不过是花哨的,全局的全局.继承是你在类级别看到的,但是静态实际上并不属于类级别(因为它们是全局的),因此继承应该不适用.它在Java中的事实是令人不安的.
斯卡拉确实走在了这个部门的高路上; 我们应该感激的事情.正如另一个答案所提到的,定义"继承"静态的正确方法是将继承的成员提取到特征中:
trait Inherited {
def foo() { ... }
def bar(i: Int) = ...
}
class Person {
...
}
object Person extends Inherited
class Student extends Person {
...
}
object Student extends Inherited
Run Code Online (Sandbox Code Playgroud)
它似乎比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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2758 次 |
| 最近记录: |