在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
?
我知道方法因为讨论而有所区别。你可以在构建课程时讨好吗?这就是为什么存在这种奇怪的重复?
答案 0 :(得分:9)
没有区别。 abstract class
只是一个带有class
修饰符的abstract
,除非抽象成员以某种方式实现(无论是通过mixins等),否则它会强加您无法实例化的规则。无参数类和具有空参数列表的类没有区别。如果类没有参数列表,则编译器假定为空。
如果没有给出正式的参数部分,则假定为空参数部分()。
因为它们是等价的,所以你应该使用的只是品味问题。为简洁起见,我宁愿省略括号,但编译器会将它们添加回来。
这可能让事情变得混乱的唯一一次是你有一个只有隐式参数的类。例如,这个:
abstract class Foo(implicit bar: Bar)
实际上是
abstract class Foo()(implicit bar: Bar)
当手动提供隐式时会导致混淆,并且必须提供括号。 e.g。
new Foo()(new Bar)