开发者学堂课程【Scala 核心编程-基础:自身类型(selftype)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/9002
自身类型(selftype)
内容介绍
一、说明
二、应用案例
三、整理
一、说明
自身类型:主要是为了解决特质的循环依赖问题,比如将来 console,它是一个类,继承了一个类 Exception,混入一个特质 Logger。假如 Exception 是 a,Logger 是 b,这两者要有相同的父类,但是如果将来 a 和 b 它们类型之间是相互引用,所以就形成循环依赖。同时可以确保特质在不扩展某个类的情况下,依然可以做到限制混入该特质的类的类型,Self-type。
二、应用案例
举例说明自身类型特质,以及如何使用自身类型特质。
//Logger 就是自身类型特质
trait Logger {
//明确告诉编译器,我就是 Exception,如果没有这句话,下面的 getMessage 不能调用,直接给编译器进行标记,这样就避免编译器在动态处理时才会发生循环依赖问题
this: Exception =>
def log():Unit ={
//既然我就是 Exception,那么就可以调用其中的方法
println(getMessage)
}
}
class Console extends Logger {} //对吗?
class Console extends Exception with Logger//对吗?
1、新建一个包,Selftype 自身类型。相当于自己告诉编译器我是谁。
2、新建一个包,SelfTypeDemo,选择 Object。
package com. atguigu. chapter08. selftype
; object SelfTypeDemo {
def main(args: Array[string]): Unit = {
}
}
//Logger 就是自身类型特质,当这里做了自身类型后,那么
//trait Logger extends Exception 为了给编译器做说明,要求混入该特质的类也是 Exception 子类
trait Logger {
//明确告诉编译器,我就是 Exception, 如果没有这句话,下面的 getMessage 不能调用
this: Exception => 假设没有这句话,这个方法用不了
def log(): Unit ={
//既然我就是 Exception, 那么就可以调用其中的方法
println(getMessage)
}
}
class Console extends Logger {} //对吗? 错误 Logger 是 Exception 子类,Console 不是 Exception 子类,不能是继承了之后才是子类,要求比原先的更严格
class Console extends Exception with Logger {} //对吗? 先继承 Exception,再进行混入
作用是防止在混入时两者之间进行嵌套的使用。
三、整理
1、说明
自身类型:主要是为了解决特质的循环依赖问题,同时可以确保特质在不扩展某个类的情况下,依然可以做到限制混入该特质的类的类型。
2、应用案例
举例说明自身类型特质,以及如何使用自身类型特质。
package com. atguigu. chapter08. selftype
; object SelfTypeDemo {
def main(args: Array[string]): Unit = {
}
}
//Logger
//trait Logger extends Exception
trait Logger {
//明确告诉编译器,我就是 Exception, 如果没有这句话,下面的 getMessage 不能调用
this: Exception =>
def log(): Unit ={
//既然我就是 Exception, 那么就可以调用其中的方法
println(getMessage)
}
}
class Console extends Logger {} //对吗? 错误
class Console extends Exception with Logger {} //对吗?
不要过多研究,只需要记住语法,记住如何用即可。