如何在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条评论
登录后参与评论

相关文章

来自分类Dev

是否有可能在派生类构造函数中捕获从基类构造函数抛出的异常

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何避免在C ++中的派生类中重复基类构造函数参数?

来自分类Dev

从基类构造函数调用派生类的成员函数

来自分类Dev

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

来自分类Dev

未调用派生类的c ++ / cli静态构造函数

来自分类Dev

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

来自分类Dev

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

来自分类Dev

在派生类中无意基类构造函数“隐藏”

来自分类Dev

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

来自分类Dev

为什么派生类可以调用基类构造函数两次?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

从派生类调用重载的基本构造函数

来自分类Dev

从派生类调用构造函数

来自分类Dev

派生类中的重载构造函数

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

在基类构造函数中使用派生类属性

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

Related 相关文章

  1. 1

    是否有可能在派生类构造函数中捕获从基类构造函数抛出的异常

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

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

  6. 6

    如何避免在C ++中的派生类中重复基类构造函数参数?

  7. 7

    从基类构造函数调用派生类的成员函数

  8. 8

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

  9. 9

    未调用派生类的c ++ / cli静态构造函数

  10. 10

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

  11. 11

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

  12. 12

    在派生类中无意基类构造函数“隐藏”

  13. 13

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

  14. 14

    为什么派生类可以调用基类构造函数两次?

  15. 15

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

  16. 16

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

  17. 17

    从派生类调用重载的基本构造函数

  18. 18

    从派生类调用构造函数

  19. 19

    派生类中的重载构造函数

  20. 20

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

  21. 21

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

  22. 22

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

  23. 23

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

  24. 24

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

  25. 25

    在基类构造函数中使用派生类属性

  26. 26

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

  27. 27

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

  28. 28

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

  29. 29

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

热门标签

归档