将依赖对象传递给Scala中的父构造函数

Nic*_*son 2 constructor scala subclass

假设我有以下类heirarchy:

class A()
class B(a:A)
class C(b:B)

class BaseClass(b:B, c:C)
Run Code Online (Sandbox Code Playgroud)

现在我想实现一个BaseClass的子类,它给出一个A的实例,并构造B和C的实例,并将它传递给它的超类构造函数.

如果我可以使用任意表达式,我会做这样的事情:

b = new B(a)
c = new C(b)
super(b, c)
Run Code Online (Sandbox Code Playgroud)

因为父构造函数的第二个参数依赖于第一个参数的值,但是我没有看到任何方法来执行此操作,不使用工厂函数或无偿的hack,例如:

class IntermediateSubclass(b:B) extends BaseClass(b, new C(b))
class RealSubclass(a:A) extends IntermediateSubclass(new B(a))
Run Code Online (Sandbox Code Playgroud)

有干净的方法吗?

Ran*_*ulz 5

处理这种情况的最佳方法可能是在您要编写的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)
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以将任何构造函数参数创建到字段中而不会影响任何内容(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)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在SBC可以使用这种表达式创建新实例:( SBC(aValue)无论是否使用vals).

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
Run Code Online (Sandbox Code Playgroud)