开发者学堂课程【Scala 核心编程-基础:扩展类的特质】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/9001
扩展类的特质
内容介绍
一、扩展类的特质
二、整理
一、扩展类的特质
1、特质可以继承类,以用来拓展该类的一些功能,兼顾很多特性,很灵活。
LoggedException 继承 Exception,这个特质继承类。
trait LoggedException extends Exception{
通过继承一个类,扩展一个特质,再混入时,就又增强了功能
def log(): Unit ={
printin(getMessage())
//方法来自于 Exception 类
}
}
2、创建命名为 extendtrait。
新建一个文件,命名为 ExtendTraitDemo01,选择 object。
package com. atguigu. chapter08. extendtrait
object ExtendTraitDemo01
{
def main(args: Array[String]): Unit =
{
}
}
//说明
//1.LoggedException 继承了 Exception
//2.LoggedException 特质就可以使用 Exception 功能
trait LoggedException extends Exception
{
Def
log(): Unit =
{
println(getMessage())
//方法来自于 exception 类
}
}
点击 Exception,点击 type Exception = java. lang·Exception,点击 public class Exception extends Throwable { ,可以找到 public String getMessage( ) {return detailMessage;}充分体现特质的又一个特点。可以继承 Exception,也可以继承别的,功能就会很强大。
3、所有混入该特质的类,会自动成为那个特质所继承的超类的子类。就是前面混入 Exception,如果有另外一个类混入 trait,那么 UnhappyException 类就成为了 Exception 的子类,这就会有很多特性。
trait LoggedException extends Exception{
def log(): Unit ={
printin(getMessage())
//方法来自于 Exception 类
}
}
//UnhappyException 就是 Exception 的子类
比如 UnhappyException 混入 LoggedException,UnhappyException 是 Exception 的子类
//因为 UnhappyException 继承了 LoggedException
//而 LoggedException 继承了 Exception
//UnhappyException 就成为 Exception 的子类
class UnhappyException extends LoggedException{
//已经是 Exception 的子类了,所以可以重写方法
override def getMessage= "错误消息!”
}
4、如果混入该特质的类,已经继承了另一个类(A 类),则要求 A 类是特质超类的子类,否则就会出现了多继承现象,发生错误。
//如果混入该特质的类,已经继承了另一个类(A 类),则要求 A 类是特质超类的子类
//否则就会出现了多继承现象,发生错误。
UnhappyException2已经变成 Exception 的子类,再混入 Inde x0ut0fBoundsException,它的父类是 Exception,特质的超类是 Exception。如果继承的类不是 Exception 的子类就会报错。
class UnhappyException2 extends Inde x0ut0fBoundsException with LoggedException{
//已经是 Exception 的子类了,所以可以重写方法
override def getMessage= "错误消息!”
}
class CCC {}
//错误的原因是 ccc 不是 Excetion 的子类
class UnhappyException3 extends CCC with LoggedException{
//已经是 Exception 的子类了,所以可以重写方法
override def getMessage= "错误消息!”
}
输出为 haha,进行运行。
Println(‘’haha~~‘’)
执行结果如下:
Error:(37, 42) llegal inheritance; superclass Ccc is not a subclass of the superclass Exception of the mixin trait LoggedExceptionlt class UnhappyException3 extends Ccc with LoggedException
报错,定位在37行,它不允许这么输入,假设这种形式可以成立,那意味着 scala 支持多继承的,但本质是 scala 实现单继承。如果这个可以成立,那么 UnhappyException3即是 CCC 的子类,又可以是 Exceptio 的子类,那么就打破了 java 底层的单继承机制,它不允许,只有 c++语言支持多继承,但是多继承还是有很多限制,现在几乎所有的编程语言都是单继承机制,但是为了弥补单继承,像 java 用接口,scala 用的是 trait ,像 go 语言用的是结构体,它在想尽办法解决。
class CCC extends Exception{}
再运行,运行结果输出 haha~~
二、整理
1、特质可以继承类,以用来拓展该特质的一些功能。
trait LoggedException extends Exception{
def log(): Unit ={
printin(getMessage())
//方法来自于 Exception 类
}
}
2、所有混入该特质的类,会自动成为那个特质所继承的超类的子类。比如继承 Exception,LoggedException 自动成为 Exception 的子类,以此类推。
//说明
//1. LoggedException 继承了 Exception
//2.LoggedException 特质就可以 Exception 功能
trait LoggedException extends Exception
{
def log(): Unit =
{
println(getMessage())
//方法来自于 Exception 类
}
}
3、如果混入该特质的类,已经继承了另一个类(A 类),则要求 A 类是特质超类的子类,否则就会出现了多继承现象,发生错误。继承这个类需要跟混入的 Exception 有相同的类。
class UnhappyException2 extends Inde x0ut0fBoundsException with LoggedException{
//已经是 Exception 的子类了,所以可以重写方法
override def getMessage= "错误消息!”
}
class CCC {}
//错误的原因是 ccc 不是 Excetion 的子类
class UnhappyException3 extends CCC with LoggedException{
//已经是 Exception 的子类了,所以可以重写方法
override def getMessage= "错误消息!”
}