我有一个JavaScript类/构造函数:
function Grid(size, tileFactory, previousState, over, won) {
this.size = size;
this.tileFactory = tileFactory;
this.cells = previousState ? this.fromState(previousState) : this.empty();
this.over = over ? over : false;
this.won = won ? won : false;
}
我使用这个ScalaJS外观映射了以下内容:
@js.native
class Grid[T <: Tile](val size: Int,
val tileFactory: TileFactory[T],
previousState: js.Array[js.Array[TileSerialized]],
val over: Boolean,
val won: Boolean) extends js.Object {
val cells: js.Array[js.Array[T]] = js.native
def this(size: Int, tileFactory: TileFactory[T]) = this(???, ???, ???, ???, ???)
...
}
我想扩展Grid
类,我已经这样做了:
@ScalaJSDefined
class ExtendedGrid(
override val size: Int,
override val tileFactory: TileFactory[Tile],
previousState: js.Array[js.Array[TileSerialized]],
override val over: Boolean,
override val won: Boolean) extends Grid(size, tileFactory, previousState, over, won) {
...
}
但是现在我还需要为这个ExtendedGrid
类实现重载的构造函数。
问题是,,我该怎么做?
理想情况下,我想做这样的事情:
def this(size: Int, tileFactory: TileFactory[Tile]) = super(size: Int, tileFactory: TileFactory[Tile])
但据我所知,这在Scala中是不可能的。
为了尝试一下,我尝试简单地复制我在外观中定义的原始重载构造函数:
def this(size: Int, tileFactory: TileFactory[T]) = this(???, ???, ???, ???, ???)
它确实编译了,但显然会导致浏览器错误:
Uncaught scala.NotImplementedError: an implementation is missing
然后我试着:
def this(size: Int, tileFactory: TileFactory[Tile]) = this(size, tileFactory, this.empty(), false, false)
模拟原始JavaScript函数的行为,但没有效果。它会产生以下错误:
this can be used only in a class, object, or template
发布于 2016-03-05 23:38:35
您要调用的构造函数并没有真正重载。它更接近于拥有带有可选值的默认参数。在JS中,默认参数基本上是undefined
。因此,可以对父构造函数进行不同的建模:
@js.native
class Grid[T <: Tile](val size: Int,
val tileFactory: TileFactory[T],
previousState: js.UndefOr[js.Array[js.Array[TileSerialized]]] = js.undefined,
_over: js.UndefOr[Boolean] = js.undefined,
_won: js.UndefOr[Boolean] = js.undefined) extends js.Object {
val over: Boolean = js.native
val won: Boolean = js.native
val cells: js.Array[js.Array[T]] = js.native
...
}
然后,在定义类时可以模仿相同的结构:
@ScalaJSDefined
class ExtendedGrid(size: Int,
tileFactory: TileFactory[Tile],
previousState: js.UndefOr[js.Array[js.Array[TileSerialized]]] = js.undefined,
_over: js.UndefOr[Boolean] = js.undefined,
_won: js.UndefOr[Boolean] = js.undefined) extends Grid(size, tileFactory, previousState, _over, _won) {
...
}
顺便说一句,不要使用override val
,因为您要将值传递给父构造函数,并且从超类获得val
。
https://stackoverflow.com/questions/35821396
复制相似问题