2016-12-04 101 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

相關問題