Вероятно, лучший способ справиться с подобной ситуацией - написать фабричный метод в объекте-компаньоне для подкласса BaseClass, который вы хотите написать.
class A()
class B(a:A)
class C(b:B)
class BaseClass(b:B, c:C)
class SBC private (a: A, b: B, c: C)
extends BaseClass(b, c)
object SBC
{
def
apply(a: A): SBC = {
val b = new B(a)
val c = new C(b)
new SBC(a, b, c)
}
}
Вы можете превратить любой из этих параметров конструктора в поля, не влияя ни на что (префиксом val
, если вы не знакомы с этим синтаксисом):
class A()
class B(val a: A)
class C(val b: B)
class BaseClass(val b: B, val c: C)
class SBC private (val a: A, b: B, c: C)
extends BaseClass(b, c)
object SBC
{
def
apply(a: A): SBC = {
val b = new B(a)
val c = new C(b)
new SBC(a, b, c)
}
}
Теперь можно создавать новые экземпляры SBC
с таким выражением: SBC(aValue)
(независимо от того, используются ли val
s).
scala> val a1 = new A
a1: A = A@14a8f44
scala> val sbc1 = SBC(a1)
sbc1: SBC = SBC@7d8bb
scala> sbc1.a
res0: A = A@14a8f44
scala> sbc1.b
res1: B = B@c7272
scala> sbc1.c
res2: C = C@178743b