Scala抽象类
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日
这个怎么样:
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 }
你可以通过添加 {}
来实例化 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)))