我来自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中所做的不同,在java中,所有赋值等都发生在一个方法主体中。。我想我在这里错过了一个大的设计模式
有人能帮我解释一下Scala的设计模式吗??
这实际上与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
的情况相同。只有Action { ... }
不进行子类化,而是在Action
伴随对象上调用方法apply
,使语法更加简洁(这样就不会有"构造函数"语句,例如不能编写accelerator = None
等等)。
我同意0_的解释,只是想补充一点,如果我回忆正确,你可以在java中使用做同样的事情
JFrame frame = new JFrame {{
title = "Electronic Classroom";
}};
这应该创建一个匿名子类,并将附加代码附加到构造函数