开发者学堂课程【Scala 核心编程-基础:动态混入特质对字段的处理】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/8999
动态混入特质对字段的处理
内容介绍
一、特质中的具体字段
二、举例
三、特质中的抽象字段
四、整理
一、特质中的具体字段
特质中可以定义具体字段,如果初始化了就是具体字段,如果不初始化就是抽象字段。混入该特质的类就具有了该字段,该特质,字段不是继承,而是直接加入类,成为自己的字段。
二、举例
[案例演示+反编译]
特质,有一个具体的字段,比如 DB6,DB6里面有一个具体的字段,赋值了,当有一个 MySQL6混入了 DB6后,它在底层,实际上是给匿名子类直接加入一个字段,而不是继承下来的
trait DB6 extends Operate6 {
var opertype : String = "insert"
def insert(): Unit ={
}
}
class MySQL6 {}
var mysql = new MvSQL6 with DB6
//通过反编译,可以看到 opertype
println(mysql.opertype)
创建命名为 mixinpro,选择 object。
写一个案例。
package com. atguigu. chapter08. mixin
object MixInPro{
Val mySQL =new MySQL6 with DB6 混入DB6
def main(args: Array[String]): Unit = {
trait DB6 { 暂时不继承
var opertype : String = "insert"
def insert(): Unit ={
}
}
class MySQL6 {}
执行看效果,没有问题,当混入产生一个对象时,opertype 是什么机制,打开反编译工具,找到 MixInPro$.class,进行打开。
可以看到当混入一个特质时,private String opertype 直接放进去了,相当于去创建一个混入对象,它把从父特质的属性直接加入到 MySQL6中,并没有进行继承。
三、特质中的抽象字段
1、特质中未被初始化的字段在具体的子类中必须被重写。
2、举例:
假如这里有一个抽象的字段,给它一个类型,立刻报错,因为抽象的字段没有给值,再进行混入,没有实现就会报错,
package com atguigu. chapter08 mixin
object MixInPro {
def main(args: Array[string]): Unit = {
val mySQL = new MySQL6 with DB6
Override var sal= ‘’‘’底层会显示相应的方法,给它一个具体值,这个代码是必须给的,因为它底层相当于把对应的方法进行生成,就是抽象方法要实现,抽象字段也要实现。
}
}
trait DB6{
Var sal:int
var opertype : string = insert"
def insert(): Unit = {
}
}
class MySQL6{}
把这个拿到进行实现,点击 OK。
四、整理
1、特质中的具体字段
特质中可以定义具体字段,如果初始化了就是具体字段,如果不初始化就是抽象字段。混入该特质的类就具有了该字段,字段不是继承,而是直接加入类,成为自己的字段。[案例演示+反编译]
package com atguigu. chapter08 mixin
object MixInPro {
def main(args: Array[string]): Unit = {
val mySQL = new MySQL6 with DB6
}
}
trait DB6{
var opertype : string = insert"
def insert(): Unit = {
}
}
class MySQL6{}
2、反编译后代码
public void main (String[] args)
{
MySQL6 mySQL . new MvSQL6() { private String opertype;父特质的普通字段,被直接加入到混入对象
pub1ic String opertype(){ return this · opertype; }
@TraitSetter
public void opertype_ $eq (String x$1) [ this. opertype = x$1; }
public void insert() { DB6.clasa. insert(this); } } ;
}
private MixInPro$ () {
MODULE$ = this ;
}
}
3、特质中的抽象字段
特质中未被初始化的字段在具体的子类中必须被重写。
package com atguigu. chapter08 mixin
object MixInPro {
def main(args: Array[string]): Unit = {
val mySQL = new MySQL6 with DB6
Override var sal= ‘’‘’
}
}
trait DB6{
Var sal:int
var opertype : string = insert"
def insert(): Unit = {
}
}
class MySQL6{}