4

この下のクラスでは:

package patternmatching

abstract class Expr {

  case class Var(name: String) extends Expr
  case class Number(num: Double) extends Expr
  case class UnOp(operator: String, arg:Expr) extends Expr
  case class BinOp(operator: String, left: Expr, right: Expr) extends Expr


}

メインクラスを次のように定義します。

package patternmatching
import patternmatching.Expr.Var

object PatternMain {

      def main(args:Array[String]) {

         val v = Var("x")
    }

}

しかし、次の行の PatternMain でコンパイル時エラーが発生しますimport patternmatching.Expr.Var

  • オブジェクト Expr はパッケージ patternmatching のメンバーではありません 注: クラス Expr は存在しますが、コンパニオン オブジェクトはありません。

val v = Var("x")ケースクラス Var に対して正しく呼び出すにはどうすればよいですか? 正しくインポートしていませんか?

4

1 に答える 1

7

abstractキーワードを削除し、 を に変更class Exprobject Exprます。あなたのコードに関する限り、これらの変更を行わない理由はありません。

Exprただし、実際に抽象クラスを維持したい場合は、それを拡張してインスタンス化する必要があります。

def main(args:Array[String]) {
    val expr = new Expr {} // extending the class - this creates a anonymous class
    val v = expr.Var("x")

    // alternatively, since now we do have a object to import
    import expr._
    val v2 = Var("x")

    // even another approach, now using a named class
    class MyExpr extends Expr
    val myexpr = new MyExpr
    val v3 = myexpr.Var("x")
}

説明:

  • メンバーをインポートできるのは、オブジェクトとパッケージのみです
  • インスタンス化するには、抽象クラスを拡張する必要があります。ここでの考え方は、クラス内のいくつかの「ポイント」をクライアントが定義する必要がある一方で、残りのインターフェースを抽象クラスの他の拡張機能と共有する必要があるということです。
于 2012-10-17T22:14:42.673 に答える