我来自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的设计模式吗?
答案 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语法,我有点生疏)
MenuBar
,Menu
,MenuItem
的情况相同。只有Action { ... }
不是子类,而是在apply
伴侣对象上调用方法Action
,使语法更简洁(这样你就不会有“构造函数”语句,例如你不能写accelerator = None
等等。
答案 1 :(得分:0)
我订阅了0 __的解释,只是想补充一点,如果我没记错的话,你可以在java中做同样的事情
JFrame frame = new JFrame {{
title = "Electronic Classroom";
}};
这应创建一个匿名子类,并在构造函数
附加附加代码