开发者学堂课程【Scala 核心编程-基础:动态混入特质】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/8994
动态混入特质
内容介绍:
一、带有具体实现的特质
二、带有特质的对象,动态混入
一、带有具体实现的特质
说明:和 Java 中的接口不太一样的是特质中的方法并不一定是抽象的,也可以有非抽象方法(即:实现了的方法)。[案例演示+反编译]
trait Operate
{
def insert( id: Int ): Unit =
{
printIn("保存数据="+id)
}
}
trait DB extends Operate
{
override def insert( id : Int ); Unit =
{
print("向数据库中")
super.insert(id)
}
}
class MySQL extends DB
{
}
二、带有特质的对象,动态混入
动态混入真正实现了解耦,用一个类继承一个 trait 之后,子类也会得到,一个类的混入不会影响它任何一个子类,真正达到一个解耦。
1、除了可以在类声明时继承特质以外,还可以在构建对象时混入特质,扩展目标类的功能[反编译看动态混入本质]
2、此种方式也可以应用于对抽象类功能进行扩展
3、动态混入是 Scala 特有的方式(java 没有动态混入),可在不修改类声明/定义的情况下,扩展类的功能,非常的灵活,耦合性低。修改代码是封闭的,但功能扩展是开放的,闭合原则,就是 ocp 原则,修改源码是关闭的,功能扩展开放,ocp 原则,动态混入就会有一定的体现,同时在隐式转换也充分体现了 ocp 原则,在底层做包装。
4、动态混入可以在不影响原有的继承关系的基础上,给指定的类扩展功能。也就是原先的继承关系不会受到任何影响,包括子类也不会受任何影响
5、案例演示
创建 mixin 混入
(1)创建 mixindemo01
package com. atguigu. chapter08. mixin
object MixInDemo01 {
defmain(args: Array[String]): Unit = {
//在不修改类的定义基础,让他们可以使用 trait 方法
Val oracleDB =new OracleDB-with Operate3 动态混入,也就是在创建一个对象时,同时混入 trait,就拥有insert方法
OracleDB.
insert
(100)
//如果没有 with Operate3是用不了的,会提示立刻识别
}
}
trait Operate
3{
//特质
def insert( id: Int ): Unit =
{
printIn("保存数据="+id)
//方法(默认实现)
}
}
class OracleDB
{
一个是
OracleDB
//空的,没有方法,这个代码类的定义不动,希望它能够用到 Operate3里面的 insert 的方法
}
abstract class MySQL3
{
一个是抽象的
MySQL3
//
空
}
运行,运行结果就是插入数据=100。
对一个普通的类进行扩展,也可以对一个抽象的类进行扩展。抽象类中没有方法,这么用是可以的,抽象类不是不能实例化吗?
package com. atguigu. chapter08. mixin
object MixInDemo01 {
defmain(args: Array[String]): Unit = {
//在不修改类的定义基础,让他们可以使用trait方法
Va
l
oracleDB =new OracleDB-with Operate3
OracleDB.
insert
(100)
val
MySQL3
=
new
MySQL3
with
Operate3
val t = new MySQL3{}大括号要保留,只是因为抽象类中没方法,实际上就是匿名子类,
mySQL. insert(200)
更改为200,也可以运行
}
}
trait Operate
3{
//特质
def insert( id: Int ): Unit =
{
printIn("保存数据="+id)
//方法(实现)
}
}
class OracleDB
{ //
空
}
abstract class MySQL3
{ //
空
}
(2)var oracle = new OracleDB with Operate3
oracle.insert(999)
val mysql = new MySQL3 with Operate3
mysql.insert(4)
6、思考:如果抽象类中有抽象的方法,如何动态混入特质?
写一个抽象方法
package com. atguigu. chapter08. mixin
object MixInDemo01 {
defmain(args: Array[String]): Unit = {
//在不修改类的定义基础,让他们可以使用 trait 方法
Va
l
oracleDB =new OracleDB-with Operate3
OracleDB.
insert
(100)//
val
MySQL3
=
new
MySQL3
with
Operate3
mySQL. insert(200)
//如果一个抽象类有抽象方法,如何动态混入特质
val
MySQ
l
_ =
New
MySQL3
_
with
Operate
3{
抽象类有抽象方法
Override
def
say
(): Unit =
{
需要把实现部分写到后面,不能写在前年
Println
(
‘’
say‘’
)
}
}
MySQ
l
_
.insert(999)
MySQ
l
_
.
say
()
}
}
trait Operate
3{
//特质
def insert( id: Int ): Unit =
{
printIn("保存数据="+id)
//方法(实现)
}
}
class OracleDB
{ //
空
}
abstract class MySQL3
{ //
空
abstract class MySQL3
_{ //
空
Def
say
()
}
运行之后,可以看到插入数据=999,以上就是关于动态混入的基本介绍。