在特质中重写抽象方法|学习笔记

简介: 快速学习在特质中重写抽象方法。

开发者学堂课程【Scala 核心编程-基础:在特质中重写抽象方法】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/609/detail/8997


在特质中重写抽象方法

 

内容介绍

、在特质中重写抽象方法特例

在特质中重写抽象方法

 

一、在特质中重写抽象方法特例

1、提出问题,看段代码

trait Operate5 {

def insert(id : Int)  抽象方法

}

trait File5 extends Operate5 {  File5 继承 Operate5

def insert( id : Int ): Unit = {  实现方法

printn("将数据保存到文件中.")

super.insert(id) 调用把父类的方法实现了又调用父特征的方法跟特质混入有关系

}

}

2、运行代码,并小结问题

新建一个包命名为 mixindemo02。选择 object

代码的语法没有问题但是这个代码一定会错因为调用会调用 inser 父类的 super而 insert 里面是没有实现的这个错误会在运行时报出来错误是 Error:(15, 11) method insert in trait Operate5 is accessed from super. It may not be abstract unless it is overridden by a member declared ‘abstract' and ’override' super.insert(id)不是抽象的加上关键字‘abstract' and ’override'在 特质里面有一个方法重写了父类方法但是仍然是抽象方法针对这个问题的解决方法是加上 abstract override def insertidint):unit={,再次运行代码就可以了

//说明

//1. 如果我子特质中重写/实现了一个父特质的抽象方法但是同时调用super

//2.这时我们的方法不是完全实现,因此需要声明abstract override,调用者注意还需要实现这个方法不然仍然不能用

//3.这时 super . insert(id) 的调用跟动态混入的顺序有密切的关系动态 super 它不一定指的是父类如果 super 是左边混入的 insert,代码就可以正常运行因为有时看源码写法都是这样的

abstradt override def insert( id : Int ): Unit = {

println("格数据保存到文件中..")

super . insert(id)  

}

}

代码错误的原因是,没有完全的实现 insert,同时还没有声明 abstract overrid。

3、解决问题

方式1:去掉 super()...

方式2:调用父特质的抽象方法,那么在实际使用时,没有方法的具体实现,无法编译通过,为了避免这种情况的发生。可重写抽象方法,就是加入 abstract overrid,这样在使用时,就必须考虑动态混入的顺序问题。

package com. atguigu. chapter08. mixin

object MixInDemo02 {

def main(args: Array[String]): Unit = {

//println("xxx")

val mySQL5 = new MySQL5 with DB5 with File5

//1. 将数据保存到文件中

//2. 将数据保存到数据库中

mySQL5. insert(666)

}

}

trait Operate5 {

def insert(id : Int)

}

trait File5 extends Operate5 {  调用 File5找到 File5

//说明

//1.如果我们在子特质中重写/实现了一个父 特质的抽象方法,但是同时调用 super

//2.这时我们的方法不是完全实现,因此需要声明为 abstract override

//3.这时 super. insert(id)的调用就和动态混入顺序有密切关系

abstract override def insert( id : Int ): Unit = {  构建这个地方跟方法没有关系因此不受任何影响正常是不可以调用但是有abstract这就是它重写抽象的特点正常重写抽象不可以调用但是它可以调用

println("将数据保存到文件中..")  没有再调用 super终止后代码得到顺利的执行

super . insert(id)

}

}

trait DB5 extends Operate5 {//我们继承 Operate5,并实现Operate 的  insert

def insert( id: Int ): Unit= {

printIn("将数据保存到数据库中..")

}

}

class MySQL5 []

val mysql5 = new MySQL5 with DB5 with File5

执行后代码没有任何问题这时必须考虑动态混入顺序假如把代码进行颠倒从编译来看它并没有报错

val mySQL5_ = new MySQL5 with File5 with DB5

mySQL5. insert(66)

这样执行会报错因为 DB5构建仍然是正常执行不混入 DB5只混入 File5就出现报错

//下面的混入方式错误

//val mySQL5_ = new MySQL5 with File5

//mySQL5. insert(66)

只混入DB5是可以的如果只混入 File5那么就会进行报错因为编译层面就没有进行控制编译如果通过File5到super 没有地方跑因为左边没有东西

 

二、在特质中重写抽象方法

1、理解 abstract override 的小技巧分享:

可以理解,当我们给某个方法增加了 abstract override 后,就是明确的告诉编译器,该方法确实是重写了父特质的抽象方法,但是重写后,该方法只仍然是一个抽象方法因为没有完全的实现,需要其它特质继续实现通过混入顺序混入是产生新的对象它的类的关系是重新构建的它仍然会进行 super 的调用

2、重写抽象方法时需要考虑混入特质的顺序问题和完整性问题看4个案例,并判断结果。

var mysq|2 = new MySQL5 with DB5 //ok  因为 DB5就是简单的实现

mysq|2.insert(100)

var mysql3 = new MySQL5 with File5 //error 因为 super 已经找不到东西了

mysql2.insert(100)

var mysq|4 = new MySQL5 with File5 with DB5// error 

mysq|4.insert(100)

首先它找到 DB5没有执行断掉了这里只输出一句话将数据保存到数据库中执行后报错它在混入时是继承的重组

var mysql4 = new MySQL5 with DB5 with File5//ok

mysql4.insert(100)

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
基于Adaboost模型的数据预测和分类matlab仿真
AdaBoost(Adaptive Boosting)是一种由Yoav Freund和Robert Schapire于1995年提出的集成学习方法,旨在通过迭代训练多个弱分类器并赋予分类效果好的弱分类器更高权重,最终构建一个强分类器。该方法通过逐步调整样本权重,使算法更关注前一轮中被误分类的样本,从而逐步优化模型。示例代码在MATLAB 2022A版本中运行,展示了随着弱分类器数量增加,分类错误率的变化及测试数据的分类结果。
494 13
|
存储 数据采集 监控
云上数据安全保护:敏感日志扫描与脱敏实践详解
随着企业对云服务的广泛应用,数据安全成为重要课题。通过对云上数据进行敏感数据扫描和保护,可以有效提升企业或组织的数据安全。本文主要基于阿里云的数据安全中心数据识别功能进行深入实践探索。通过对商品购买日志的模拟,分析了如何使用阿里云的工具对日志数据进行识别、脱敏(3 种模式)处理和基于 StoreView 的查询脱敏方式,从而在保障数据安全的同时满足业务需求。通过这些实践,企业可以有效降低数据泄漏风险,提升数据治理能力和系统安全性。
|
数据挖掘 BI 数据库
在Power BI中使用中文作为表名会发生什么?
【11月更文挑战第13天】在 Power BI 中使用中文表名能提升报表的直观性和与本地化数据的融合度,尤其适合中文使用者。然而,这也可能导致兼容性问题、排序筛选难题及代码引用复杂度增加。尽管如此,Power BI 正持续优化以改善这些问题。
233 2
|
机器学习/深度学习 搜索推荐 大数据
大数据与教育:学生表现分析的工具
【10月更文挑战第31天】在数字化时代,大数据成为改善教育质量的重要工具。本文探讨了大数据在学生表现分析中的应用,介绍学习管理系统、智能评估系统、情感分析技术和学习路径优化等工具,帮助教育者更好地理解学生需求,制定个性化教学策略,提升教学效果。尽管面临数据隐私等挑战,大数据仍为教育创新带来巨大机遇。
|
DataWorks 搜索推荐 大数据
聊聊DataWorks——这个一站式智能大数据开发治理平台
聊聊DataWorks——这个一站式智能大数据开发治理平台
745 2
|
机器学习/深度学习 存储 人工智能
【博士每天一篇文献-算法】改进的PNN架构Progressive learning A deep learning framework for continual learning
本文提出了一种名为“Progressive learning”的深度学习框架,通过结合课程选择、渐进式模型容量增长和剪枝机制来解决持续学习问题,有效避免了灾难性遗忘并提高了学习效率。
524 4
|
存储 测试技术 数据处理
阿里云实时计算企业级状态存储引擎 Gemini 技术解读
阿里云实时计算企业级状态存储引擎 Gemini 技术解读
483 57
|
存储 NoSQL MongoDB
深入解析 MongoDB 与 Python:基本语法、实用示例与最佳实践
深入解析 MongoDB 与 Python:基本语法、实用示例与最佳实践
287 0
|
jenkins Linux 持续交付
使用jenkins实现自动拉取码云代码,实现自动化部署
紧接着上文说起,咱们这次来完成基于jenkins的自动化部署,也就是当有新的代码推送就会触发自动构建。 上一节我们已经实现了手动部署,大部分基础配置都已完成,不了解的可以先回顾下。。。。 基于jenkins实现手动拉取码云代码,实现半自动化部署 要实现自动化部署,其实这部分操作非常简单,只需要配置好构建触发器以及触发的事件即可。
1230 0
使用jenkins实现自动拉取码云代码,实现自动化部署
|
JavaScript
Layui-admin-iframe通过页面链接直接在iframe内打开一个新的页面,实现单页面的效果
Layui-admin-iframe通过页面链接直接在iframe内打开一个新的页面,实现单页面的效果
1032 0
Layui-admin-iframe通过页面链接直接在iframe内打开一个新的页面,实现单页面的效果