扩展类的特质|学习笔记

简介: 快速学习扩展类的特质。

开发者学堂课程【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= "错误消息!”

}

相关文章
|
7月前
|
设计模式 Java
装饰者模式:打破继承限制,实现灵活的功能扩展
装饰者模式:打破继承限制,实现灵活的功能扩展
90 0
|
Java
Java面向对象三大特性之多态及综合练习
Java面向对象三大特性之多态及综合练习
109 0
|
3天前
|
程序员 C# 数据库
C# 比较对象新思路,利用反射技术打造更灵活的比较工具
中途接手的项目,碰到需要在更新对象信息时比较并记录差异的需求,最变态的还有附加要求,怎么办?有没有既能满足需求又能对项目影响最小的方法呢?分享这个我封装的方法,一个利用反射技术打造的更灵活的比较工具
|
2月前
|
存储 编译器 C语言
C++类与对象深度解析(一):从抽象到实践的全面入门指南
C++类与对象深度解析(一):从抽象到实践的全面入门指南
56 8
|
4月前
|
Java 开发者 C++
|
6月前
|
设计模式 Java 数据库
Java设计模式:桥接模式实现灵活组合,超越单一继承的设计之道(十)
Java设计模式:桥接模式实现灵活组合,超越单一继承的设计之道(十)
|
6月前
|
Java 开发者 C++
Java面向对象的终极挑战:抽象类与接口的深度解析!
【6月更文挑战第17天】在Java OOP中,抽象类和接口助力代码复用与扩展。抽象类不可实例化,提供通用框架,适合继承;接口包含纯抽象方法,支持多态与松耦合。选择抽象类用于继承已有方法和状态,接口则适用于不相关类共享行为。Java 8后接口能含默认方法,增加设计灵活性。抽象类与接口常结合使用,以实现最佳设计,如`Shape`抽象类实现`Drawable`和`Selectable`接口,展现两者协同优势。理解和熟练运用这对概念是提升代码质量的关键。
48 0
|
7月前
|
Java 编译器 C#
【C++ 继承的多样性】C++ 多继承与虚拟继承:探究核心原理与应用实践
【C++ 继承的多样性】C++ 多继承与虚拟继承:探究核心原理与应用实践
214 1
|
7月前
|
设计模式 算法 数据库
【C++ 继承】C++继承解密:一步步引领您从基础到实战
【C++ 继承】C++继承解密:一步步引领您从基础到实战
85 0
|
编译器 C#
【C#本质论 七】类-从设计的角度去认知(继承)(下)
【C#本质论 七】类-从设计的角度去认知(继承)(下)
71 0