首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在扩展本机类的ScalaJS类中调用重载的超级构造函数

在扩展本机类的ScalaJS类中调用重载的超级构造函数
EN

Stack Overflow用户
提问于 2016-03-05 23:54:45
回答 1查看 140关注 0票数 3

我有一个JavaScript类/构造函数:

代码语言: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外观映射了以下内容:

代码语言:javascript
运行
复制
@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类,我已经这样做了:

代码语言:javascript
运行
复制
@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类实现重载的构造函数。

问题是,,我该怎么做?

理想情况下,我想做这样的事情:

代码语言:javascript
运行
复制
def this(size: Int, tileFactory: TileFactory[Tile]) = super(size: Int, tileFactory: TileFactory[Tile])

但据我所知,这在Scala中是不可能的。

为了尝试一下,我尝试简单地复制我在外观中定义的原始重载构造函数:

代码语言:javascript
运行
复制
def this(size: Int, tileFactory: TileFactory[T]) = this(???, ???, ???, ???, ???)

它确实编译了,但显然会导致浏览器错误:

代码语言:javascript
运行
复制
Uncaught scala.NotImplementedError: an implementation is missing

然后我试着:

代码语言:javascript
运行
复制
def this(size: Int, tileFactory: TileFactory[Tile]) = this(size, tileFactory, this.empty(), false, false)

模拟原始JavaScript函数的行为,但没有效果。它会产生以下错误:

代码语言:javascript
运行
复制
this can be used only in a class, object, or template
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-06 07:38:35

您要调用的构造函数并没有真正重载。它更接近于拥有带有可选值的默认参数。在JS中,默认参数基本上是undefined。因此,可以对父构造函数进行不同的建模:

代码语言:javascript
运行
复制
@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

  ...
}

然后,在定义类时可以模仿相同的结构:

代码语言:javascript
运行
复制
@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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35821396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档