这是一个有点痛在单独的类来做到这一点,但它可能是比有一个巨大的文件,一切都那么痛苦。首先,您需要确保将所有文件一起编译。然后,在你的文件,你要确保一切是密封的,你做到以下几点:
trait GenericA { def foo: Int }
sealed trait A extends GenericA
case class B() extends A with ImplB {}
case class C() extends A with ImplC {}
...
诀窍是,一切都在超类(它可以是一个抽象类,而不是一个特征,如果你愿意的话)去到GenericA
。但你永远不会在你的代码中使用使用GenericA
,你只需使用A
。现在,你可以写一堆的每个执行单独的文件,像这样定义的:
// File #1
trait ImplB extends GenericA { def foo = 7 }
// File #2
trait ImplC extends GenericA { def foo = 4 }
...
现在,你有你的实现分离出来(这只能在Generica产品来表示,至少那些部分)。
如果您还需要可用的案例类参数,该怎么办?没问题 - 只包括那些作为特质的一部分。
// Main file
case class D(i: Int) extends A with ImplD {}
// Separate file
trait ImplD {
def i: Int
def foo = i*3
}
这一点额外的工作,因为你不得不重复在两个点的情况下类参数,但在你的情况下,它可能是值得的。
如果班上有很多小类(在你的情况30),你可能不应该把它封闭起来。您不希望每次想要再次进行子类化时都必须更改它。 –