Scala中的匿名子类

时间:2013-09-15 14:29:48

标签: scala

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

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中Anonymous Subclass的用法/优点是什么。如果您有任何积分,请在此处分享。感谢。

Regadrs, Sudipta

2 个答案:

答案 0 :(得分:9)

在Scala中使用匿名子类与使用anonymous subclasses in Java没有什么不同。 Java中最常见的用法可能是observer pattern,如第一个链接所示。

该示例直接转换为Scala:

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

但是,在Scala中你可能宁愿使用匿名函数(如果库允许你):

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

在Scala中,您可以使用匿名子类,如果:

  1. 您的客户要求您扩展指定的界面
  2. 您一次注册多个事件(例如java.awt.MouseListener
  3. 这些当然只是一些例子。在没有命名类对您有意义的任何位置,您可以使用匿名(子)类。

答案 1 :(得分:2)

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

请注意,只有匿名类实现/扩展的接口或基类定义的成员和方法才会在匿名类外部显示。在您的示例中,这意味着您的sayHellosayBye方法只能由匿名的覆盖printMyName(如果此方法需要调用它们)或匿名类的构造函数调用,因为匿名之外没有其他人class将能够了解它们,因为它们是在基类(Person)中声明的 Not