0

私はMartinOderskyの本「ProgramminginScala」からScalaを学んでいます。彼の「パッケージとインポート」の章には、マーティンがインポート句がどのように機能するかを示している例があります。Scalaのインポート句の理解をテストするために、EclipseでScalaパースペクティブの下でVegetable.scalaというソースファイルを作成しました。このコードは、特性の名前をFruitからVegetableに変更したことと、名前を変更したことを除いて、Martinのコードと同じです。以下に示すのは、Vegetable.scalaのコードです。

package com.att.scala
import java.awt.Color

trait Vegetable {
  val name: String
  val color: Color
}

object Vegetables {
   object Asparagus extends Vegetable { } 
   object Shallot extends Vegetable { }
   object Cauliflower extends Vegetable { }
   object Spinach extends Vegetable { }
   val veggiePlatter = List(Asparagus, Shallot)
}

これらは私の発見です:Eclipseはこのコードをコンパイルすることを望んでいません。「オブジェクトの作成は不可能です。なぜなら、java.awt.Color型の特性野菜の値の色が定義されていないためです。文字列型の特性野菜の値名が定義されていません」

このコードから達成したいのは、このエラーが発生する理由を理解することです。アスパラガス、エシャロット、カリフラワーに野菜を使用できるようにするにはどうすればよいですか?この時点での私のかなり(素朴な)理解は、VegetableとVegetablesは同じパッケージと同じソースファイルで発生するため、たとえば、特性VegetableはオブジェクトAsparagus(Vegetableを拡張する)に表示される必要があるということです。

このように特性を使用する前に知っておく必要のある特性について、何か具体的なことはありますか?

4

3 に答える 3

5

オブジェクトの実装がありません。これは機能するはずです:

package com.att.scala
import java.awt.Color

trait Vegetable {
  val name: String
  val color: Color
}

object Vegetables {
   object Asparagus extends Vegetable { 
       name = "Asparagus"
       color = new Color(255,255,255)
   } 
   //...
}

値のないval宣言は、「実装」、つまり値が必要であるという点でJavaの抽象メソッドに似ています。

于 2012-08-22T17:12:03.587 に答える
2

Asparagus問題は可視性の問題ではありません。etcは必要なフィールドの値を提供しないため、コンパイルされませんextends Vegetable。必要な各オブジェクトは、と値を指定するextends Vegetable必要があります。namecolor

以下は問題なくコンパイルされます。

trait Vegetable {
    val name: String
    val color: String
}

object Vegetables {
    object Asparagus extends Vegetable {
        val name = "Asparagus"
        val color = "Green"
    }
}
于 2012-08-22T17:13:02.900 に答える
2

エラーが示すように、トレイトで定義された名前または色の変数に値を指定していません。

次のようなデフォルト値を指定できます。

trait Vegetable {
  val name: String = "Some Vegetable"
  val color: Color = Color.GREEN
}

ただし、オーバーライドしない限り、各オブジェクトに対して同じ値が生成されます。オブジェクトごとに定義するには、次のようなことを行う必要があります。

object Asparagus extends Vegetable { 
  val name = "Asparagus"
  val color = Color.GREEN
} 
于 2012-08-22T17:13:32.863 に答える