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

Oth*_*ers 3 parameters inheritance abstract-class scala call

在Scala中,有什么区别:

abstract class Foo
// And
abstract class Bar()
Run Code Online (Sandbox Code Playgroud)

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

// 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
Run Code Online (Sandbox Code Playgroud)

这些都是等价的,还是有区别的?如果它们都是等价的,我应该使用哪个抽象类定义,Foo或者Bar

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

Mic*_*jac 9

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

SLS第5.3节明确说明了这一点:

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

因为它们是等价的,所以你应该使用它的味道.为简洁起见,我更喜欢省略括号,但编译器无论如何都会将它们添加回去.

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

abstract class Foo(implicit bar: Bar)
Run Code Online (Sandbox Code Playgroud)

实际上是

abstract class Foo()(implicit bar: Bar)
Run Code Online (Sandbox Code Playgroud)

当人们试图手动提供隐含时,会导致混淆,并且必须提供括号.例如

new Foo()(new Bar)
Run Code Online (Sandbox Code Playgroud)