创建Object时,不使用def或val关键字将值设置为方法或变量

时间:2013-08-14 20:10:28

标签: scala scala-swing

我来自Java背景,正如预期的那样,我在理解Scala中使用的一些模式时遇到了问题(见下文)。每当我觉得我对Scala模式或编程方法有很好的理解时,弹出的东西超出了我的编程理解,并让我回到学习模式。我想这是一种美丽的斯卡拉,总能激励我继续学习:)

无论如何,我试图在scala swing中做一些示例编程.............

val frame = new MainFrame {
title = "Electronic Classroom"
contents = new BorderPanel {
  layout += new GridPanel(1, 2) {

    contents += new ScrollPane(semesterList)
    contents += new ScrollPane(courseList)
  } -> West

}

menuBar = new MenuBar {
  contents += new Menu("File") {

    contents += new MenuItem("Login") {
      action = Action("Login"){
          login
            user match{
          case Some(inst:Instructor) => instructorMenu.enabled = true
           enabled = false
           case Some(_) => instructorMenu.enabled = false
             enabled = false
          case _ =>
        }
      }

    }
    contents += new Separator
    contents += new MenuItem(Action("Exit")(sys.exit(0)))
  }
        }
  contents += instructorMenu
}

size = new Dimension(1000, 600)
centerOnScreen
 }

这里我们设置def和val的值而不使用def或val关键字定义它们(比如标题,大小,内容等),它现在看起来更像是一个与我们在java中的方式不同的正文脚本所有的任务等都发生在一个方法体中。我想我在这里错过了一个很大的设计模式

有人可以帮助,abd向我解释Scala的设计模式吗?

2 个答案:

答案 0 :(得分:1)

这实际上与Java没有什么不同 - 而不是创建实例然后自定义它,您正在创建匿名子类。 E.g。

val frame = new MainFrame {
  title = "Electronic Classroom"
}

而不是

val frame = new MainFrame
frame.title = "Electronic Classroom"

与Java的不同之处在于,由于Scala没有专用的构造函数方法,而是处理构造函数的类部分体内的所有表达式,因此您的匿名子类会“覆盖”构造函数。

要直接与Java比较,我们可以说它不是匿名的:

class MyMainFrame extends MainFrame {
  title = "Electronic Classroom"
}

在Java中,这大致相当于:

public class MyMainFrame extends JFrame {
    public MyMainFrame() {
        super();
        setTitle("Electronic Classroom");
    }
}

(我希望这是有效的Java语法,我有点生疏)


MenuBarMenuMenuItem的情况相同。只有Action { ... }不是子类,而是在apply伴侣对象上调用方法Action,使语法更简洁(这样你就不会有“构造函数”语句,例如你不能写accelerator = None等等。

答案 1 :(得分:0)

我订阅了0 __的解释,只是想补充一点,如果我没记错的话,你可以在java中做同样的事情

JFrame frame = new JFrame {{
    title = "Electronic Classroom";
}};

这应创建一个匿名子类,并在构造函数

附加附加代码