将字段传递给具有没有类似构造函数的Java父类的Scala子类构造函数

时间:2017-03-17 10:18:31

标签: scala constructor

我有一个用Scala编写的抽象基类,它扩展了第三方(开源)Java 7类:

SkyBar

所以基本上我希望能够构造新的SpaceBarFoo实例,强制它们在构造函数中接受Bar参数。随后我希望super()构造函数:

  1. Fizz上调用其setFoo(foo)(无参数)父构造函数;但是
  2. 在其子类构造函数传入的Foo实例上调用其父var divs = $(".contents"); for(var i = 0; i < divs.length; i+=2) { j = i + 1; divs.slice(i, i+2).wrapAll("<div id='newDivforWraping"+j+"' class='new'></div>"); } setter
  3. 我是Scala的新手,无法透过树林看到森林。如何让所有这些结合在一起?!

1 个答案:

答案 0 :(得分:2)

您可以在setFoo的正文中拨打Bar

abstract class Bar(val foo: Foo) extends Fizz {
  setFoo(foo)
}

我不认为您希望foo成为公共领域(因为val修饰符):

abstract class Bar(foo: Foo) extends Fizz {
  setFoo(foo)
}

否则你有一个不可变字段foo和一个可变(get / set)Foo属性。

要详细说明这一点,如果你foo val,你就会遇到这样的不一致:

scala> class Bar(val foo: Foo) extends Fizz {
     |   setFoo(foo)
     | }
defined class Bar

scala> val bar = new Bar(Foo(1))
bar: Bar = Bar@3a384e3d

scala> bar.getFoo
res7: Foo = Foo(1)

scala> bar.foo
res8: Foo = Foo(1)

scala> bar.setFoo(Foo(2))

scala> bar.getFoo
res10: Foo = Foo(2)

scala> bar.foo
res11: Foo = Foo(1)  // still the old foo!!!

如果您不公开val,则不会bar.foo