Scala抽象类

9 浏览
0 Comments

Scala抽象类

我是Scala的新手,不确定如何调用抽象类来创建所需的对象。任何帮助都将是极好的。

abstract class Expr{
    case class Number(n:Double) extends Expr
    case class Sum(e1:Expr, e2: Expr) extends Expr
    case class Subtract(e1: Expr, e2: Expr) extends Expr
    case class Divide(e1: Expr, e2: Expr) extends Expr
    case class Abs(e1: Expr) extends Expr
    case class Mod(e1: Expr, e2: Expr) extends Expr
    def eval(e:Expr): Double = e match{
        case Number(n) => n;
        case Sum(e1,e2) => eval(e1) + eval(e2);
    }
}
object main{
    def main(args: Array[String])  {
        val e = Expr();
        println("hello");
    }
}

所以我想创建Expr对象并在其上使用eval。谢谢。

admin 更改状态以发布 2023年5月21日
0
0 Comments

这个怎么样:

abstract class Expr {
  def eval: Double
}
case class Number(n:Double) extends Expr {
  def eval = n
}
case class Sum(e1:Expr, e2: Expr) extends Expr {
  def eval = e1.eval + e2.eval
}
case class Subtract(e1: Expr, e2: Expr) extends Expr {
  def eval = e1.eval - e2.eval
}
object Eval {
  def apply(e : Expr) = e.eval
}

0
0 Comments

你可以通过添加 {} 来实例化 Expr 以指示空的类体。因此,如果你写

val e = Expr() {};
val n = e.Number(1.0);
val sum = e.Sum(n, n);
println(e.eval(sum));

你的代码将可以工作。但我不明白为什么需要将 case class 存放在 Expr 类内部。为什么不写成:

abstract class Expr {}
object Eval {
  def apply(e : Expr) = e match{
    case Number(n) => n;
    case Sum(e1,e2) => Eval(e1) + Eval(e2);
  }
}
case class Sum(e1 : Expr, e2 : Expr) extends Expr

这样你可以更好地引用它们:

Eval(Sum(Number(1), Number(1)))

0