首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从对象中的主方法调用case类

从对象中的主方法调用case类
EN

Stack Overflow用户
提问于 2012-10-17 21:51:29
回答 1查看 4K关注 0票数 4

在下面的课程中:

代码语言:javascript
复制
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


}

我将主类定义为:

代码语言:javascript
复制
package patternmatching
import patternmatching.Expr.Var

object PatternMain {

      def main(args:Array[String]) {

         val v = Var("x")
    }

}

但是,在PatternMain中,我在import patternmatching.Expr.Var行接收到一个编译时错误:

  • 对象Expr不是包模式匹配的成员注意:类Expr存在,但它没有伴生对象。

如何对case类Var正确地调用val v = Var("x")?我没有正确地导入它吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-17 22:14:42

删除abstract关键字并将class Expr转换为object Expr。就您的代码而言,我认为没有理由不进行这些更改。

但是,如果您确实想让Expr保持一个抽象类,则必须扩展和实例化它:

代码语言:javascript
复制
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")
}

解释:

  • 只有对象和包才能导入其成员。
  • 为了实例化,必须扩展抽象类。这里的想法是,类中的某些“点”需要由客户端定义,同时仍然与抽象类的其他扩展共享接口的其余部分。
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12943995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档