如何在Scala中从派生类辅助构造函数调用辅助基类构造函数?

用户名

您可以通过派生类的主构造函数在基类中调用辅助构造函数:

class Base(n:Int) {
    def this(n:Int, i:Int) = {
        this(n)
        println(i)
    }
}

class Derived(n:Int, i:Int) extends Base(n, i)

是否有用于从辅助派生类构造函数调用辅助基类构造函数的语法?这不起作用:

class Derived2(n:Int) extends Base(n) {
    def this(n:Int, i:Int) = {
        super.this(n, i) // Can't do this
        println(i)
    }
}

在其他语言中,您可以执行此操作,但是必须首先调用基类构造函数,这就是我在此处尝试执行此操作的原因。

请注意,我在寻找该调用的语法,而不是获得相同结果的替代方法。

诺亚

在Scala中,无论如何,您都必须通过默认构造函数,这将迫使您在类实例化中选择一个超级构造。基本上,这就是您要使用Java进行的操作:

public class Derived2 extends Base {
    public Derived2(int n, int i) {
        super(n, i);
    }
    public Derived2(int n) {
        super(n);
    }
}

由于在Scala中,您必须通过默认的构造函数,因此发生了这种情况:

public class Derived2 extends Base {
    public Derived2(int n, int i) {
        this(n);
        super(n, i); //does not compile
    }
    public Derived2(int n) {
        super(n);
    }
}

因此,与Java中的正常情况一样,您只能调用superthis作为构造函数实现的第一行。由于Scala会强制调用默认构造函数,因此无法仅使用Base构造函数的一种实现

没有解决方法,因为这不是真正的教条式的Scala。我建议在这里更改您的设计。Scala中的继承通常是通过特征而不是类或抽象类完成的。

这是使用特征的替代品的外观:

  trait Base2 {
    val a:Int
  }

  class Derived3(n: Int) extends Base2 {

    val a = n

    def this(n: Int, i: Int) = {
      this(n)
    }
  }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在模板派生类中调用模板基类的构造函数?

如何在C ++中从基类构造函数调用派生类方法?

从派生类构造函数调用基类构造函数

从Java中的派生类调用基类构造函数

如何使用指向函数的指针在基类构造函数中调用派生类的方法?

在派生类 C++ 的构造函数中调用基类的构造函数

从模板派生类调用模板基类的构造函数

在声明派生类时调用基类的构造函数

如何在派生类构造函数中初始化基类成员变量?

在派生构造函数中的某些代码块之后,在派生类中调用基类构造函数

C#-在派生类中调用基类和类构造函数

从派生类调用构造函数

Laravel :: 使用构造函数调用辅助类中的方法

是否可以从基类构造函数调用派生类构造函数?

让隐式派生类构造函数调用基类构造函数

C ++派生类构造函数调用基类构造函数错误

基类构造函数在Java中调用重写方法时派生类对象的状态

调用基类的构造函数而不在派生类中定义它

(为什么)在纯虚拟派生类中是否需要虚拟基类构造函数调用?

使用CRTP时如何调用派生类的构造函数?

如何在基类构造函数中使用派生类成员

派生类中的重载构造函数

如何使用基类的数据成员作为派生类的构造函数?(在 C++ 中)

如何避免在TypeScript,Angular2的派生类中重复基类构造函数参数?

当派生类无法轻松将参数传递给基类时,如何调用基类构造函数?

在派生类构造函数中引发异常。为什么调用基类析构函数而不是派生类析构函数?

复制派生类的构造函数,更改基类

从派生类访问模板基类的构造函数

从派生复制构造函数调用基类的移动构造函数