7.6 嵌套类
即, 在 class 中, 再定义一个 class, 以此类推.
Java 中的内部类从属于外部类. Scala 中内部类从属于实例.
1) 创建一个嵌套类, 模拟局域网的聊天场景
- import scala.collection.mutable.ArrayBuffer
- // 嵌套类
- class Network{
- class Member(val name: String){
- val contacts = new ArrayBuffer[Member]
- }
- private val members = new ArrayBuffer[Member]
- def join(name: String) = {
- val m = new Member(name)
- members += m
- m
- }
- }
2) 使用该嵌套类
- // 创建两个局域网
- val network1 = new Network
- val network2 = new Network
- //nick 和 alice 加入局域网 1
- val nick = network1.join("Nick")
- val alice = network1.join("Alice")
- //jone 加入局域网 2
- val jone = network2.join("Jone")
- //nick 和 alice 互相添加为好友
- val nick = network1.join("Nick")
- val alice = network1.join("Alice")
- //nick.contacts += jone // 这样不行, nick 和 jone 不属于同一个局域网, 即, nick 和 jone 不是同一个 class Member 实例化出来的对象
在 Scala 中, 每一个实例都有它自己的 Menber 类, 就和他们有自己的 members 字段一样. 也就是说,
network1.Member 和 network2.Member 是不同的两个类. 也就是所谓的:
路径依赖类型, 此处需要详细解释.
如果想让 members 接受所有实例的 Member, 一般有两种办法:
1) 将 Member 作为 Network 的伴生类对象存在
创建类:
- import scala.collection.mutable.ArrayBuffer
- class Network {
- val contacts = new ArrayBuffer[Network.Member]()
- // 用于存放局域网中的对象
- val members = new ArrayBuffer[Network.Member]()
- def join(name: String) = {
- val m = new Network.Member(name)
- members += m
- m
- }
- }
- object Network{
- class Member(name: String){
- // 用于存放某个 Mem 对象的联系人
- val contacts = new ArrayBuffer[Member]()
- }
- }
2) 使用类型投影, 注意留意关键符号:"#"
创建类:
- import scala.collection.mutable.ArrayBuffer
- class Network {
- class Member(name: String){
- // 用于存放某个 Mem 对象的联系人
- val contacts = new ArrayBuffer[Network#Member]()
- }
- // 用于存放局域网中的对象
- val members = new ArrayBuffer[Network#Member]()
- def join(name: String) = {
- val m = new Member(name)
- members += m
- m
- }
- }
来源: http://www.bubuko.com/infodetail-3111656.html