开发者学堂课程【Scala 核心编程-基础:隐式转换丰富类库功能】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/9008
隐式转换丰富类库功能
内容介绍
一、基本介绍
二、分析解决方案
三、快速入门案例
四、整理
一、基本介绍
1、用隐式转换的功能丰富类库。
2、如果需要为一个类增加一个方法,可以通过隐式转换来实现。(动态增加功能)比如想为 MySQL 类增加一个delete方法。
二、分析解决方案
1、在当前程序中,如果想要给 MySQL 类增加功能是非常简单的,但是在实际项目中,如果想要增加新的功能就会需要改变源代码,这是很难接受的。而且违背了软件开发的 OCP 开发原则。(闭合原则 open close priceple),OCP开发原则的观点是修改代码被关闭,增加功能被开放,OCP 原则在设计模式还会介绍,后面会介绍一种模式,这种模式非常轻松的增加功能。
2、在这种情况下,可以通过隐式转换函数给类动态添加功能。
三、快速入门案例
使用隐式转换方式动态的给 MySQL 类增加 delete 方法。
希望 MySQL 实例使用到 delete 方法,但是不能把 delete 直接拷贝过来。
class MySQL
{
def insert(): Unit =
{
printÍn("insert")
insert方法
}
}
class DB
{
def delete(): Unit =
{
println("delete")
delete方法
}
}
implicit def addDelete(mysql:MySQL): DB =
{
函数名随意写,f1,f2都可以,虽然传了一个 MySQL 对象,但是实际上根本就没有用它,这个形参只有一个作用,就是让编译器找到它,匹配到它,
new DB
}
val mysql = new MySQL
mysql. insert()
mysql.delete()
//?
//[案例演示+反编译]
创建 ImplicitDemo02,选择 object。
package com. atguigu. chapter09
object ImplicitDemo02
{
def main(args: Array[String]): Unit =
{
//编写一个隐式函数,丰富 mysql 对象的功能
如果不写关键字,编译器是不会做转换的。
Implicit adddelete(msql:mysql):DB={ 如果把 Implicit 写到外面,函数名就是 adddelete
New DB
}
如果把隐式函数放到外面,一样可以用,Implicit 仍然是 ImplicitDemo02的方法,那么在这里用没有问题,但是放在别的类中不行,编译器找不到,所以隐式函数不能乱写,要让编译器找的到它,只要让编译器在作用域上识别它就可以。很多程序员专门把隐式函数写一个文件,也是一个很好的思路。
如果把 Implicit 放到主函数里面,那么 adddelete(MySQL).delete()变成 adddelete$1(MySQL).delete()
//创建 mysql 对象
Va
l
mySQL
=
new MySQL
mySQL. insert()
mySQL.
delete
(
)//编译器工作 分析 adddelete(MySQL).delete(),传进去返回 DB
只要看见下划线,它就是用了隐式转换,源代码,很多难的就是隐式转换。
mySQL.update( )因为返回的是 DB 对象实例
}
}
class MySQL
{
Def
insert(): Unit =
{
println(" insert")
}
}
class DB
{
def delete(): Unit =
{
println("
delete
" )
}
def update():Unit={
println("update" )
}
}
Class dog{
}
运行结果如下,没有问题。
insert
Delete
运行后,打开反编译软件,打开 ImplicitDemo02.class。
package com. atguigu . chapter09;
public final class ImplicitDemo02$
{
public static final
MODULE$;
static
{
new () ;
}
public void main (String[] args)
{
MvSQL mySQL = new MvSQL() ;
mySQL. insert();
addDslete$1 (mySQL) .delete()
; 前面已经是 DB 对象实例
}
private final DB addDelete$1 (MySQL msql)
{
return new DB() ;
}
private Implici tDemo02$ ()
{
MODULE$ . this;
}
}
就相当于隐式的增加一个功能。
四、整理
快速入门案例
使用隐式转换方式动态的给 MySQL 类增加 delete 方法。
案例代码:
package com. atguigu. chapter09
object ImplicitDemo02
{
def main(args: Array[String]): Unit =
{
//编写一个隐式函数,丰富 mysql 对象的功能
Implicit
adddelete
(
msql
:
mysql
):
DB
={
New
DB
}
//创建 mysql 对象
Va
l
mySQL
=
new MySQL
mySQL. insert()
mySQL.
delete
( )
//编译器工作 分析 adddelete(MySQL).delete(),传进去返回 DB
mySQL.
update
( )
}
}
class MySQL
{
Def
insert(): Unit =
{
println(" insert")
}
}
class DB
{
def delete(): Unit =
{
println("
delete
" )
}
def update():Unit={
println("update" )
}
}
Class dog{
}