具有零参数的抽象类和没有参数的抽象类之间有什么区别?
问题描述:
在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
难道这些真的都等同,或者是有区别吗?如果他们是所有等价物,我应该使用哪种抽象类定义,Foo
或Bar
?
我知道方法使这种区别因为柯里化。在建造一堂课时你可以咖喱吗?这就是为什么这种奇怪的重复存在?
答
没有区别。一个abstract class
只是一个class
与abstract
修饰符,它强加了规则,除非抽象成员以某种方式实现(无论是通过mixins等)否则不能实例化它。而且,无参数类和带有空参数列表的类没有什么区别。如果一个类没有参数列表,编译器会假定它是空的。
这在SLS Section 5.3明确提出:
如果没有正式的参数部分给出,假设一个空的参数段()。
由于它们是等价的,它实际上只是一个你应该使用的品味问题。为了简洁起见,我宁愿省略括号,但编译器会将它们添加回来。
这可能会让事情混淆的唯一时候是当你有一个只有隐式参数的类。例如,这样的:
abstract class Foo(implicit bar: Bar)
实际上
abstract class Foo()(implicit bar: Bar)
是引起混乱当一个人试图手工提供隐式的,并且在括号必须提供。例如
new Foo()(new Bar)
+0
非常好,这完全回答了我的问题,谢谢。 – Others
据我所知,柯里里就是其中的原因。我在建造一堂课时从未尝过苦头,但我猜这是可能的。 –