具有零参数的抽象类与没有参数的抽象类之间有什么区别?

时间:2016-12-04 19:58:47

标签: scala inheritance parameters call abstract-class

在Scala中,有什么区别:

object[]

继承时,它们之间似乎没有区别:

abstract class Foo
// And
abstract class Bar()

这些是否真的相同,还是有区别?如果他们 都是等价的,我应该使用哪个抽象类定义,// All of these seem to work case class FooA() extends Foo() case class FooB() extends Foo case class BarA() extends Bar() case class BarB() extends Bar Foo

我知道方法因为讨论而有所区别。你可以在构建课程时讨好吗?这就是为什么存在这种奇怪的重复?

1 个答案:

答案 0 :(得分:9)

没有区别。 abstract class只是一个带有class修饰符的abstract,除非抽象成员以某种方式实现(无论是通过mixins等),否则它会强加您无法实例化的规则。无参数类和具有空参数列表的类没有区别。如果类没有参数列表,则编译器假定为空。

SLS Section 5.3

中明确说明了这一点
  

如果没有给出正式的参数部分,则假定为空参数部分()。

因为它们是等价的,所以你应该使用的只是品味问题。为简洁起见,我宁愿省略括号,但编译器会将它们添加回来。

这可能让事情变得混乱的唯一一次是你有一个只有隐式参数的类。例如,这个:

abstract class Foo(implicit bar: Bar)

实际上是

abstract class Foo()(implicit bar: Bar)

当手动提供隐式时会导致混淆,并且必须提供括号。 e.g。

new Foo()(new Bar)