开发者学堂课程【Scala 核心编程-基础:特质快速入门案例】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/8990
特质快速入门案例
目录:
一、trait 的声明
三、特质的快速入门案例
一、trait 的声明
1、基本语法
trait 特质名{
trait 体
}
2、命名规范
trait 命名一般首字母大写。如:Cloneable , Serializable
object T1 extends Serializable {
}
Serializable: 就是 scala 的一个特质。
在 Scala 中,所有 Java 中的接口可以当做特质来使用。
3、案例
(1) 案例:Serializable
新建 New Package,Enter new package name为mytrait。再新建Create New Scala Class,Name为TrailtDemo01,Kind为object。
打开编辑:
package com.atguigu.chapter08.mytrait
object TraitDemo01 {
def main(args: Array[String]): Unit = {
}
}
object T1 extends Serializable {
}
这里的 Serializable 是 Java 的一个特质,继承了 io。点击 Serializable,按快捷键 Ctrl+b,看程序提示:
/.../
package scala
/**
* Classes extending this trait are serializable across platforms (Java, .NET).
*/
trait Serializable extends Any with java.io.Serializable
可以看到:Serializable 变成一个 trait,实际就是 Java 的接口。所以,在 Scala 中,所有 Java 中的接口可以当做特质来使用。
Serializable 继承 Any。Any 是所有类的父类。如果表示为 Serializable 是一个接口去继承一个类,比较难理解。但trait是接口和抽象类的结合体,它去继承类,是容易理解的。
说明:trait Serializable extends Any with java.io.Serializable
在 scala 中,java 的接口都可以当做 trait 来使用(如上面的语法)
(2) 案例:Cloneable
除了 Serializable 可以包装成 trait 外,还有 Cloneable 也可以。
object T2 extends Cloneable {
}
点击 Cloneable,按快捷键 Ctrl+b,程序提示:
/.../
package scala
/**
* Classes extending this trait are cloneable across platforms (Java,.NET).
trait Cloneable extends java.lang.Cloneable
可以看到 Cloneable 也做了包装。
二、Scala 中 trait 的使用
一个类具有某种特质(特征),就意味着这个类满足了这个特质(特征)的所有要素。所以在使用时,也采用了 extends关键字,如果有多个特质或存在父类,那么需要采用 with 关键字连接
1、没有父类。
一个类需要继承特质,该类没有父类,想继承多个特质,语法如下:
class 类名 extends 特质1 with 特质2 with 特质3...
2、有父类
需要继承特质又要继承父类。需先继承父类,再继承特质。语法如下:
class 类名 extends 父类 with 特质1 with特质2 with 特质3
三、特质的快速入门案例
1、可以把特质看作是对继承的一种补充
Scala 的继承是单继承,也就是一个类最多只能有一个父类,这种单继承的纯洁性,比 c+中的多继承机制简洁。但对子类功能的扩展有一定影响。所以认为: Scala 引入 trait 特征,可以替代Java的接口,也是对单继承机制的一种补充。
图中,B 类、C 类继承 A 类。E 类、F 类继承 D 类。需要将 C 类和
E 类能够增加一个方法获取数据库的连接。这个方法可以不一样。
如,C 类是连接的 MySQL 数据库,E 类连接的是 Oracle 数据库。这个方法规范需要在 trait 里面定义,这是 trait最经典的应用方法。
定义一个规范让对应的类实现。
2、案例
在 mytrait 目录下新建 Create New Scala Class,Name为TraitDemo02,Kind为Object。打开编辑:
package com.atguigu.chapter08.mytrait
object TraitDemo02 {
def main(args: Array[String]): Unit = {
val c = new C()
val f = new F()
c.getConnect() //连接mysql数据库...
f.getConnect() //连接oracle教据序...
}
}
//按照要求定义一个 trait
trait Trait01 {
//定义一个规范
def getconnect( )
}
//先將六个类的关系写出
class A {}
class B extends A {}
class C extends A with Trait01{
override def getConnect(): Unit = {
println("连接mysq1数据库...")
}
class D {}
class E extends D {}
class F extends D with Trait01 {
override def getConnect(): Unit = {
println("连接oracle数据库...")
}
}
先將六个类的关系写出,然后按照要求定义一个 trait,再定义一个规范。Trait 类既有接口的特性,又有抽象类的特性。trait Trait01 声明抽象的方法。def getconnect()这里是一个抽象化。
再对 class C、class F 进行扩展。添加关键词 with,当写上 with Trait01时,C 下出现红色波浪线,报错。把光标定到 C 处,按快捷键 alt+enter,在弹出的 Select Members to Implement窗口选择 getConnect0: Unit 点击 OK。在设置输出字符。
然后创建 val c 类等于 new C(),val f 类等于 new F()。最后调用 c.getconnect()连接 mysql 数据库...,调用f.getConnect()连接 oracle 数据库...。
运行结果如下:
连接 mysql 数据库...
连接 oracle 数据库...
