编程那点事编程那点事

专注编程入门及提高
探究程序员职业规划之道!

扩大内部类作用域的2种方法、内部类获取外部类引用

扩大内部类作用域的2种方法

内部类的作用域:外部类对象

import scala.collection.mutable.ArrayBuffer
class Class {
  class Student(val name: String) 
  val students = new ArrayBuffer[Student]
  def register(name: String) =  {
    new Student(name)
  }
}
val c1 = new Class
val leo = c1.register("leo")
c1.students += leo
val c2 = new Class
val jack = c2.register("jack")
c1.students += jack   // 类型错误

扩大内部类作用域:伴生对象

// 使用半生对象
object Class {
  class Student(val name: String)
}
class Class {
  val students = new ArrayBuffer[Class.Student]
  def register(name: String) = {
    new Class.Student(name)
  }
}
val c1 = new Class
val leo = c1.register("leo")
c1.students += leo
val c2 = new Class
val jack = c2.register("jack")
c1.students += jack    // 不会出错

扩大内部类作用域:类型投影

class Class {
  class Student(val name: String) 
  val students = new ArrayBuffer[Class#Student]
  def register(name: String) =  {
    new Student(name)
  }
}
val c1 = new Class
val leo = c1.register("leo")
c1.students += leo
val c2 = new Class
val jack = c2.register("jack")
c1.students += jack

内部类获取外部类引用

class Class(val name: String) { outer =>
  class Student(val name: String) {
    def introduceMyself = "Hello, I'm " + name + ", I'm very happy to join class " + outer.name
  }
  def register(name: String) =  {
    new Student(name)
  }
}
val c1 = new Class("c1")
val leo = c1.register("leo")
leo.introduceMyself


未经允许不得转载: 扩大内部类作用域的2种方法、内部类获取外部类引用