Scala:如何继承"静态插槽"?

Dam*_*ian 7 inheritance static scala

好吧,我正在学习Scala所以这个问题可能对大多数人来说太基本了.

在Java中,我可以在类中有一个静态槽(函数或变量),然后我也将在继承的类中使用该槽.

在Scala我没有静态插槽,但我有伴侣对象.但我发现自己的这些对象不继承类的一部分,所以如果我有两个类PersonStudent,以及人与变量的同伴对象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更加冗长,但是当我说语义因此不那么令人惊讶时,相信我.


Wal*_*ang 6

我不知道这是不是你的意思,但是伴侣对象可以从某些特征/类扩展:

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)