如您所见,有几种可能的方法可以实现您的要求。然而,哪一个是最好的方式并不明显,因为这取决于您想要强调的内容(简洁性、重用性、性能)以及实际代码的外观。一些值得记住的事情是:
通过@maackle 的解决方案,表单的每个实例化
val b = new ClassB { override val argA = 3 }
class AnonSubB extends ClassB
将产生一个在幕后创建的匿名类。如果您想专注于简洁,那么这可能是要走的路,但是如果匿名类的数量增加,它们可能会减慢编译速度。
@paradigmatic 的解决方案
class ClassB(i: Int) extends ClassA(i) { ... }
val cb = new ClassB(3)
几乎一样简洁并且不会产生匿名类,但缺点是不重用argA
as 指定的默认值ClassA
(在@maackle 的解决方案中)。您可以重复该值,即声明ClassB
为
class ClassB(i: Int = 1) extends ClassA(i) { ... }
但这很容易出错,因为如果需要更改,您必须在各个地方更改默认值。
我还想提供我自己的解决方案,重点在于重用默认值而不创建匿名类,但这不太简洁:
/* ClassA has a reusable (referenceable) default value */
abstract class ClassA(val argA: Int) {
def this() = this(ClassA.defaultArgA)
}
object ClassA {
val defaultArgA = 1
}
/* ClassB reuses ClassA's default value */
class ClassB(x: Int = ClassA.defaultArgA) extends ClassA(x)
/* ClassC has a local (non-referenceable) default value */
class ClassC(x: Int = 10) extends ClassA(x)
println(new ClassB(2).argA) // 2
println(new ClassB().argA) // 1
println(new ClassC().argA) // 10