4

我试图理解 Scala 中的匿名子类。我写了下面的代码:

package com.sudipta.practice.chapter8

class Person(val name: String) {
  def printMyName = println("Name: " + name)
}

class AnonymousSubclass(val name: String) {
    val anonymousSubclass = new Person(name){
      def sayHello = "Hello, " + name
      def sayBye = "Bye, " + name
      override def printMyName = println("My name is: " + name)
    }

}

object testPerson extends App {

  def printAnonDetails (myObject: AnonymousSubclass) = {
    myObject.anonymousSubclass.printMyName
  }

  val personObject = new Person("Sudipta")
  personObject.printMyName

  val anonObject = new AnonymousSubclass("Sudipta")

  printAnonDetails(anonObject)
}

但是我无法理解 Scala 中匿名子类的用途/优势是什么。如果您有任何意见,请在这里分享。谢谢。

Regadrs,苏迪普塔

4

2 回答 2

9

在 Scala 中使用匿名子类与在 Java中使用匿名子类没有什么不同。Java 中最常见的用途可能是观察者模式,如第一个链接所示。

该示例直接转换为 Scala:

button.addActionListener(new ActionListener() {
    def actionPerformed(e: ActionEvent) {
        // do something.
    }
});

但是,在 Scala 中,您可能更愿意为此使用匿名函数(如果库允许您这样做):

button.addActionListener(e => /* do something */)

在 Scala 中,在这种情况下,您可能会使用匿名子类,如果:

  1. 您的客户要求您扩展给定的接口
  2. 您一次注册多个事件(例如 a java.awt.MouseListener

这些当然只是例子。在任何不命名类对您有意义的地方,您都可以使用匿名(子)类。

于 2013-09-15T15:10:27.203 回答
2

Scala、Java 和几乎任何其他支持它们的语言中的匿名类在您需要将某个接口或基类的实例作为参数传递给函数的情况下非常有用,并且您永远不需要使用相同的实现代码中的其他任何地方。

请注意,只有匿名类实现/扩展的接口或基类定义的成员和方法才会在匿名类之外可见。在您的示例中,这意味着您的sayHelloandsayBye方法只能由匿名的重写 printMyName (如果此方法需要调用它们)或匿名类的构造函数调用,因为匿名类之外的任何其他人都无法知道它们,如它们在基类 (Person) 中声明。

于 2013-09-15T18:19:08.340 回答