Scala过载构造函数和super

4
我不明白如何开发类似以下Java代码的Scala代码:
public abstract class A {
   protected A() { ... }
   protected A(int a) { ... }
}

public abstract class B {
   protected B() { super(); }
   protected B(int a) { super(a); }
}

public class C extends B {
   public C() { super(3); }
}

虽然学习如何开发C类程序很容易,但我不知道如何收到B类程序。请求帮助。

P.S. 我正在尝试创建自己的BaseWebPage,它派生自Wicket WebPage,这是Java中常见的做法。

1个回答

7

你是指这样的意思吗:

abstract class A protected (val slot: Int) {
    protected def this() = this(0)
}

abstract class B protected (value: Int) extends A(value) {
    protected def this() = this(0)
}

class C extends B(3) {
}

据我所知,没有办法从其中一个次要构造函数绕过主构造函数,也就是说,以下方法不起作用:

abstract class B protected (value: Int) extends A(value) {
    protected def this() = super()
}

所有的辅助构造函数都必须调用主构造函数。来自语言规范(5.3.1 构造函数定义):
一个类除了主构造函数之外还可以有其他构造函数。这些构造函数通过构造函数定义的形式 def this(ps1)...(psn) = e 来定义。 这样的定义为封闭类引入了一个附加构造函数,其参数由形式参数列表 ps1, ..., psn 给出,并且其求值由构造函数表达式 e 定义。 每个形式参数的作用域是后续的参数部分和构造函数表达式 e。强调一下,构造函数表达式要么是一个self构造函数调用this(args1)...(argsn),要么是以self构造函数调用开头的块。

谢谢你的澄清!有没有一种 Scala 的实现方式?关键是不要调用自己的构造函数,而是调用父类的构造函数。 - scorpp
No. - OlivierBlanvillain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接