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

は、これらは本当にすべて等価であるかの違いはありますか?そして、であれば、どの抽象クラス定義を使うべきですか?FooまたはBar

私は、カレー加工のためにこの区別をする方法を知っています。あなたはクラスを作るときカレーできますか?なぜこの奇妙な複製が存在するのでしょうか?

+1

私の知る限りでは、カールが理由です。私はクラスを作っているうちに自分自身をカレー化したことはありませんが、私はそれが可能であると推測しています。 –

答えて

9

違いはありません。 abstract classabstract修飾子を持つclassであり、抽象メンバが何らかの方法で実装されていない限り(mixinsなどを通して)、インスタンス化できないというルールを課しています。そして、パラメータのないクラスと、空のパラメータリストを持つクラスとの違いはありません。クラスにパラメータリストがない場合、コンパイラは空のものを仮定します。

これはSLS Section 5.3に明確に述べられている:

正式なパラメータ・セクションを指定しない場合、空のパラメータ部()が想定されます。

これらは同等であるため、実際に使用する必要がある味の問題です。私は簡潔さのために括弧を省略することを好むが、コンパイラはそれをとにかく元に戻す。

これは、暗黙的なパラメータのみを持つクラスを持つ場合に混乱を招くことがあります。例えば、この:

abstract class Foo(implicit bar: Bar) 

は、実際には1つ手動暗黙を供給しようとすると混乱を引き起こし、括弧が供給されなければならない

abstract class Foo()(implicit bar: Bar) 

あります。例えば

new Foo()(new Bar) 
+0

優秀、これは私の質問に完全に感謝します、ありがとう。 – Others

関連する問題