0

我来自 Java 背景,正如预期的那样,在理解 Scala 中使用的一些模式时遇到了问题(见下文)。每次我觉得自己对 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 中所做的所有分配的方式不同等发生在方法体中。我想我在这里错过了一个大的设计模式

有人可以帮我解释一下 Scala 设计模式吗?

4

2 回答 2

1

这实际上与 Java 并没有太大的不同——不是创建实例然后自定义它,而是创建匿名子类。例如

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 语法,我有点生疏了)


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

于 2013-08-14T20:31:50.177 回答
0

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

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

这应该创建一个匿名子类,并将附加代码附加到构造函数

于 2013-08-14T22:07:24.587 回答