2016-12-04 120 views
3

在Scala中,有什么区别:具有零参数的抽象类和没有参数的抽象类之间有什么区别?

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 

难道这些真的都等同,或者是有区别吗?如果他们所有等价物,我应该使用哪种抽象类定义,FooBar

我知道方法使这种区别因为柯里化。在建造一堂课时你可以咖喱吗?这就是为什么这种奇怪的重复存在?

+1

据我所知,柯里里就是其中的原因。我在建造一堂课时从未尝过苦头,但我猜这是可能的。 –

回答

9

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

这在SLS Section 5.3明确提出:

如果没有正式的参数部分给出,假设一个空的参数段()。

由于它们是等价的,它实际上只是一个你应该使用的品味问题。为了简洁起见,我宁愿省略括号,但编译器会将它们添加回来。

这可能会让事情混淆的唯一时候是当你有一个只有隐式参数的类。例如,这样的:

abstract class Foo(implicit bar: Bar) 

实际上

abstract class Foo()(implicit bar: Bar) 

是引起混乱当一个人试图手工提供隐式的,并且在括号必须提供。例如

new Foo()(new Bar) 
+0

非常好,这完全回答了我的问题,谢谢。 – Others