首页 > 解决方案 > Java转Scala,调用超类构造函数如何处理?

问题描述

问题摘要 - 如何将其转换为 Scala 类?

问题 - 多个构造函数调用不同的超级构造函数

Java 类 -

public class ClassConstExample extends BaseClassExample {
    private String xyzProp;
    private string inType = "def";
    private String outType = "def";
    private String flagSpecial = "none";

    public ClassConstExample(final String file, final String header, final String inType, 
             final String outType, final String flag) {
        super(file);
        init(header, inType, outType, flag);
    }

    public ClassConstExample(final String file, final String header, final String inType, 
             final String outType, final String flag, final String mode) {
        super(file, mode);
        init(header, inType, outType, flag);
    }

    public ClassConstExample(final String file, final String header, final String flag){
        super(file);
        //some logic here that's irrelevant to this
        ...
        this.xyxProp = getXYZ(header);
        this.flagSpecial = getFlagSpecial(flag);
    }
    ...
}

我一直在尝试将此类的这些构造函数转换为 scala 大约一天,但我无法在如何处理以下问题方面取得任何进展 - (多个构造函数在 Scala 中调用不同的基类构造函数)。有人介意帮助我设法转换这门课吗?我读过一些地方说用Scala中的标准调用不可能做到这一点super,那么我该如何做到这一点?

标签: javascala

解决方案


必须调用主构造函数,因此任何其他构造函数都必须调用主构造函数或另一个将调用主构造函数的构造函数。作为继承声明的一部分,在主构造函数中调用 super 的构造函数。这意味着您只能调用一个超级构造函数。

class BaseClassExample(file: String, mode: String) {
  def this(file: String) = this(file, "mode")
}

class ClassConstExample(file: String, header: String, inType: String, outType: String, flag: String, mode: String) extends BaseClassExample(file, mode) {
  def this(file: String, header: String, inType: String, outType: String, flag: String) = this(file, header, inType, outType, flag, "mode")
  def this(file: String, header: String, flag: String) = this(file, header, "inType", "outType", flag)
}
  • 请注意,BaseClassExample 参数是在主构造函数中定义的。
  • 不要使用超类默认值,只需将它们显式放在子类中(如示例中的“模式”)。
  • 由于必须调用主构造函数,因此您不需要init从每个构造函数中调用该方法(仅在主构造函数中,甚至直接在主体中调用)

推荐阅读