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



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


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

我同意0_的解释,只是想补充一点,如果我回忆正确,你可以在java中使用做同样的事情

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

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

相关内容

  • 没有找到相关文章

最新更新