ご覧のとおり、要求したことを実現する方法はいくつかあります。ただし、何を重視するか (簡潔さ、再利用、パフォーマンス) と実際のコードの外観に依存するため、どちらが最適な方法であるかは明らかではありません。心に留めておく価値のあるいくつかのことは次のとおりです。
@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
ほぼ同じくらい簡潔で匿名クラスにはなりませんが、によって指定されたデフォルト値が再利用されないという欠点があります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