18_Scala面向对象编程trait

2024-05-05 17:36

本文主要是介绍18_Scala面向对象编程trait,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • trait
  • 1.定义trait
  • 2.向类中混入特质
    • 2.1没有父类
    • 2.2有父类
  • 3.动态混入
    • 3.1动态混入查询功能到公司业务中
  • 4.父类,子类,特质初始化优先级
  • 5.Scala功能执行顺序
  • 6.常用API

trait

–特质的学习需要类比Java中的接口,源码编译之后就是interface

–scala中没有接口的概念;

–scala可以将多个对象中相同的特征从对象剥离出来,形成一个独立的语法结构 => 特质trait
如果一个对象符合这个特质,那么可以将特质混入到这个对象中

–目的:增加约束,功能补充和叠加

–如果混入多个相同的特质,为避免出现钻石问题,需要定义一个执行的顺序

1.定义trait

trait Run{def run():Unit 
}

特质中的方法是抽象方法(模板)

2.向类中混入特质

–如果有父类,采用with
–如果没有父类,采用extends
–混入多个特质,第一个用extends其余都用with

2.1没有父类

class Cat extends Run {override def run(): Unit = println("Cat run")
}

2.2有父类

class Stu extends person with Run {override def run(): Unit = println("Stu run")
}class person{}

–混入特质需要重写特质的所有抽象方法

–scala中抽象方法不需要定义,没有方法体就是抽象方法,抽象类需要加abstract

–学习时候要类比Java接口,但是特质可以继承类,接口不行

3.动态混入

–引入目的:方便程序开发OCP原则;
–开发程序代码:空难扩展开放OPEN,功能修改关闭CLOSE
–注意:OCP原则不要拿父类继承来 做OCP原则,原因是父类继承,是一种模板思想,而非程序OCP思想
–OCP原则最佳使用trait,在构建对象的时候,将新的功能混入到对象中

3.1动态混入查询功能到公司业务中

//  3.trait动态混入   也就是构建对象的时候用with进行功能混入;
class Accompany{val user = new User() with selectuser.selectUser()
}
trait select{def selectUser(): Unit = {println("select * from emp_user")}
}

小结:动态混入也就是构建对象的时候直接使用with混入特质

4.父类,子类,特质初始化优先级

trait > current class

parent > trait > current class

多个特质情况下,从左到右依次执行

left trait > right trait

5.Scala功能执行顺序

–类混入特质也存在钻石问题,但是scala采用了一种特殊的方式–功能叠加
–如果混入多个相同的特质,为避免出现钻石问题,需要定义一个执行的顺序
“此处的执行顺序就是初始化顺序的反向操作”

执行顺序跳级到xxx
前提需要有继承关系
super[xxx].operateDate()    跳级执行操作
trait Operate {def operatedata(): Unit = {println("处理数据")}
}trait Database extends Operate {override def operatedata(): Unit = {print("Database")super.operatedata() //整体意思就是Database处理数据}
}trait Log extends Operate {override def operatedata(): Unit = {print("Log   ")//此处的super表示上一级的super 此处上一级为DataBase,原因是功能一层一层包     特质中,重写的方法中使用super表示上一级super.operatedata()}
}//上述所示,Database和Log两个都继承自Operate; MySQL同时继承自Databse和Log
class MySQL extends Database with Log { //Log   Database处理数据    结果没有意义//实例化MySQL对象,后       父类 特质等方法直接可以调用,不需要重写
}

//Log Database处理数据

图解如下

在这里插入图片描述

注意要点:

1.特质就是扩展功能,一级一级的扩展;

2.即便是特质的扩展也是优先初始化父类;

3.初始化完成后调用的时候是由外向内一层一层调用;

4.可以进行跳级调用 super[xxx].operaterData();

在这里插入图片描述

6.常用API

//  判断对象是否是某个类的实例
println(mysql.isInstanceOf[Operate])    //true
//  将对象转化为某个类的实例
val value1 = mysql.asInstanceOf[Object]
println(value1)       //_18Scala面向对象编程trait.Demo02$MySQL@19bb089b
//  获取类的信息
val value = classOf[Operate]
println(value)        //interface _18Scala面向对象编程trait.Demo02$Operate

Scala中

双等号 表示非空equals

equals 表示比较内存

但是一般情况下,比较对象,都是重写equals方法,完成自定义的比较功能

这篇关于18_Scala面向对象编程trait的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/962266

相关文章

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

Java基础回顾系列-第二天-面向对象编程

面向对象编程 Java类核心开发结构面向对象封装继承多态 抽象类abstract接口interface抽象类与接口的区别深入分析类与对象内存分析 继承extends重写(Override)与重载(Overload)重写(Override)重载(Overload)重写与重载之间的区别总结 this关键字static关键字static变量static方法static代码块 代码块String类特

react笔记 8-18 事件 方法 定义方法 获取/改变数据 传值

1、定义方法并绑定 class News extends React.Component {constructor(props) {super(props)this.state = {msg:'home组件'}}run(){alert("我是一个run") //方法写在类中}render() {return (<div><h2>{this.state.msg}</h2><button onCli

Python中的私有属性与方法:解锁面向对象编程的秘密

在Python的广阔世界里,面向对象编程(OOP)是一种强大而灵活的方法论,它帮助我们更好地组织代码、管理状态,并构建可复用的软件组件。而在这个框架内,私有属性与方法则是实现封装的关键机制之一。它们不仅有助于隐藏类内部的具体实现细节,还能保护数据免受外部干扰。今天,让我们一起探索Python中私有属性与方法的魅力所在,了解它们如何在实际开发中发挥重要作用。 引言 随着软件系统变得越来越复杂,维

Day18_0.1基础学习MATLAB学习小技巧总结(18)——MATLAB绘图篇(1)

利用空闲时间把碎片化的MATLAB知识重新系统的学习一遍,为了在这个过程中加深印象,也为了能够有所足迹,我会把自己的学习总结发在专栏中,以便学习交流。 参考书目:《MATLAB基础教程 (第三版) (薛山)》 之前的章节都是基础的数据运算用法,对于功课来说更加重要的内容是建模、绘图、观察数据趋势,接下来我会结合自己的使用经验,来为大家分享绘图、建模使用的小技巧。 二维图形绘制 在本章开

18. 4 Sum

题目: 解答: 与之前的三数之和的解法类似,也是先排序,然后不断剔除不可能的条件,最后两个参数,通过两头求和计算得出。 代码: class Solution {public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> result;int len = nums.size

系统架构师考试学习笔记第三篇——架构设计高级知识(18)面向服务架构设计理论与实践

本章考点:         第18课时主要学习面向服务架构设计理论与实践。根据考试大纲,本课时知识点会涉及单选题型(约占2~5分)和案例题(25分),本课时内容偏重于方法的掌握和应用,根据以往全国计算机技术与软件专业技术资格(水平)考试的出题规律,概念知识的考查内容多数来源于实际应用,还需要灵活运用相关知识点。         本课时知识架构如图18.1所示。 一、SOA的相关概念 (

面向对象编程 和 面向过程编程 介绍

面向对象编程(Object-Oriented Programming,OOP)和面向过程编程(Procedural Programming,PP)是两种常见的编程范式。它们各自有不同的设计理念、代码组织方式和适用场景。以下是对这两种编程范式的详细介绍。 1. 面向对象编程(OOP) 面向对象编程是一种以对象为核心的编程范式,它将程序结构化为一组对象,这些对象具有特定的属性(数据)和行为(方法)

【scala 安装错误】错误: 找不到或无法加载主类 scala.tools.nsc.MainGenericRunner

错误: 找不到或无法加载主类 scala.tools.nsc.MainGenericRunner 原因: Scala安装路径中包含空格。 解决办法:scala 不要安装在E:\Program Files 这种有空格的目录下,简直坑

PHP 验证身份号码 包括15位18位

查了很多资料 发现网上身份证15位的验证并不是那么严谨  今天研究了一下  代码如下 <?phpfunction check_id_card($num){//老身份证长度15位,新身份证长度18位$length = strlen($num);if ($length == 15) { //如果是15位身份证//15位身份证没有字母if (!is_numeric($num)) {return fa