具有零参数的抽象 类 和没有参数的抽象有什么区别?
What's the difference between abstract classes with zero parameters, and those with no parameters?
在 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
这些真的都是等价的,还是有区别的?如果它们 是 都是等价的,我应该使用哪个抽象 class 定义,Foo
或 Bar
?
我知道方法之所以有这种区别是因为柯里化。构造 class 时可以柯里化吗?这就是为什么存在这种奇怪的重复的原因吗?
没有区别。 abstract class
只是带有 abstract
修饰符的 class
,它强加了一个规则,即除非抽象成员以某种方式实现(无论是通过混合等),否则你不能实例化它。无参数 class 和带有空参数列表的 class 没有区别。如果 class 没有参数列表,编译器会假定一个空参数列表。
这在SLS Section 5.3中有明确说明:
If no formal parameter sections are given, an empty parameter section () is assumed.
因为它们是等价的,所以你应该使用它真的只是一个品味问题。为了简洁起见,我更喜欢省略括号,但编译器无论如何都会将它们添加回去。
只有当您的 class 仅包含隐式参数时,这才会使事情变得混乱。例如,这个:
abstract class Foo(implicit bar: Bar)
实际上是
abstract class Foo()(implicit bar: Bar)
这会在尝试手动提供隐式时造成混淆,并且必须提供括号。例如
new Foo()(new Bar)
在 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
这些真的都是等价的,还是有区别的?如果它们 是 都是等价的,我应该使用哪个抽象 class 定义,Foo
或 Bar
?
我知道方法之所以有这种区别是因为柯里化。构造 class 时可以柯里化吗?这就是为什么存在这种奇怪的重复的原因吗?
没有区别。 abstract class
只是带有 abstract
修饰符的 class
,它强加了一个规则,即除非抽象成员以某种方式实现(无论是通过混合等),否则你不能实例化它。无参数 class 和带有空参数列表的 class 没有区别。如果 class 没有参数列表,编译器会假定一个空参数列表。
这在SLS Section 5.3中有明确说明:
If no formal parameter sections are given, an empty parameter section () is assumed.
因为它们是等价的,所以你应该使用它真的只是一个品味问题。为了简洁起见,我更喜欢省略括号,但编译器无论如何都会将它们添加回去。
只有当您的 class 仅包含隐式参数时,这才会使事情变得混乱。例如,这个:
abstract class Foo(implicit bar: Bar)
实际上是
abstract class Foo()(implicit bar: Bar)
这会在尝试手动提供隐式时造成混淆,并且必须提供括号。例如
new Foo()(new Bar)