2016-03-05 38 views
3

我有這個JavaScript類/構造函數:調用重載在ScalaJS級的超級構造函數延伸的原生類

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 

回答

3

你試圖調用構造函數是不是真的超載。它更接近於具有可選值的默認參數。在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