9 scala的类继承及trait

1 class 继承

为了提高代码的重用性,提高开发效率,Scala 的 class 是支持继承的。

Scala 的继承与 Java 的继承非常类似:

(1) 单继承:

类似于 Java,Scala 也只支持单继承,一个类只能直接继承自一个父类。这意味着一个 Scala 类可以拥有一个直接的父类,就像 Java 中一样。

(2) 继承语法:

Scala 的继承语法类似于 Java,使用 extends 关键字来继承一个父类。例如:

class ChildClass extends ParentClass {// 子类的定义
}

(3) 重写方法:

Scala 和 Java 都允许子类覆盖父类中的方法,通过使用 override 关键字来标记。例如:

class ChildClass extends ParentClass {override def someMethod(): Unit = {// 子类重写父类的方法}
}

(4) 调用父类方法:

在 Scala 中,使用 super 关键字来调用父类的方法。例如:

class ChildClass extends ParentClass {override def someMethod(): Unit = {super.someMethod() // 调用父类的方法// 子类的其他逻辑}
}

下面定义了足球员类 FootballPlayer,及它的子类,进攻球员类 Striker,防守球员类 Defender:

/*** 足球员父类** @param name 球员姓名*/
class FootballPlayer(val name: String) {def play(): String = "Playing football"
}/*** 进攻球员子类** @param name 球员姓名*/
class Striker(name: String) extends FootballPlayer(name) {override def play(): String = "Scoring goals" // 重写父类的 play 方法def celebrate(): String = s"$name is celebrating"
}/*** 防守球员子类* @param name 球员姓名*/
class Defender(name: String) extends FootballPlayer(name) {override def play(): String = "Defending the goal" // 重写父类的 play 方法def tackle(): String = s"$name is making a tackle"
}object App {def main(args: Array[String]): Unit = {// 测试val striker = new Striker("Ronaldo")println(striker.play()) // 输出 Scoring goals,调用重写后的 play 方法println(striker.celebrate()) // 输出 Ronaldo is celebrating,调用子类的 celebrate 方法val defender = new Defender("Sergio Ramos")println(defender.play()) // 输出 Defending the goal,调用重写后的 play 方法println(defender.tackle()) // 输出 Sergio Ramos is making a tackle,调用子类的 tackle 方法}
}

运行程序,控制台输出:

Scoring goals
Ronaldo is celebrating
Defending the goal
Sergio Ramos is making a tackle

2 抽象类

在 Scala 中,抽象类是一种不能被实例化的类,它们通常用于定义一些通用的行为,但又需要子类来提供具体实现的情况。

/*** 足球员抽象类* @param name 球员姓名*/
abstract class FootballPlayer(val name: String) {/*** 抽象方法,没有具体实现* @return*/def play(): String
}/*** 定义实现类 Striker 继承自抽象类 FootballPlayer* @param name 球员姓名*/
class Striker(name: String) extends FootballPlayer(name) {// 实现抽象方法 playdef play(): String = s"$name is scoring goals"
}/*** 定义实现类 Defender 继承自抽象类 FootballPlayer* @param name 球员姓名*/
class Defender(name: String) extends FootballPlayer(name) {// 实现抽象方法 playdef play(): String = s"$name is defending the goal"
}object App {def main(args: Array[String]): Unit = {// 定义进攻球员对象val striker = new Striker("Ronaldo")println(striker.play()) // 输出 Ronaldo is scoring goals// 定义防守球员对象val defender = new Defender("Sergio Ramos")println(defender.play()) // 输出 Sergio Ramos is defending the goal}
}

上面的例子中:

  • FootballPlayer 类是一个抽象类,包含一个抽象方法 play,没有具体的实现。
  • Striker 类和 Defender 类是抽象类 FootballPlayer 的实现类,它们都实现了 play 方法,并提供了具体的实现。
  • 在测试部分,创建了一个 Striker 对象和一个 Defender 对象,并分别调用它们的 play 方法。

运行代码,控制台输出:

Ronaldo is scoring goals
Sergio Ramos is defending the goal

3 特质

3.1 特质介绍

Trait(特质)是 Scala 中一种非常有用的机制,可以用于定义对象的特定特征或行为。Trait类似于 Java 中的接口。

Trait抽象类 是不同的:

  • Trait 可以被多重继承,一个类可以扩展多个 Trait,但只能继承一个抽象类。
  • Trait 不能接受构造参数,但抽象类可以。
  • Trait 与 抽象类 的语义不同,Trait 更适合描述对象的特征或行为,以及对象之间的 has-acan-do 关系。抽象类更适合描述 is-a 关系,即子类是父类的一种特定类型。

下面是一个使用特质的例子:

/*** 定义一个球员类** @param name 球员姓名*/
class FootballPlayer(val name: String)/*** 声明一个奔跑 trait*/
trait Runner {def run(name: String): String = s"${name} is running"
}/*** 声明一个得分手 trait*/
trait Scorer {def score(name: String): String = s"${name} is scoring goals"
}/*** 声明一个防守人员 trait*/
trait Defender {def defend(name: String): String = s"${name} is defending"
}/*** 创建实现类,同时继承三个 Trait** @param name 球员姓名*/
class Player(name: String) extends FootballPlayer(name) with Runner with Scorer with Defenderobject App {def main(args: Array[String]): Unit = {// 测试val player = new Player("Messi")// 输出 Player is runningprintln(player.run(player.name))// 输出 Player is scoring goalsprintln(player.score(player.name))// 输出 Player is defendingprintln(player.defend(player.name))}
}

上面的例子中:

  • 定义了一个 FootballPlayer 类,它具有一个 name 属性,用于表示足球球员的姓名。
  • Runner Trait 包含一个 run 方法,表示球员奔跑的行为。
  • Scorer Trait 包含一个 score 方法,表示球员进球的行为。
  • Defender Trait 包含一个 defend 方法,表示球员防守的行为。
  • 创建了一个名为 Player 的实现类,它继承了 FootballPlayer 类,并且同时混入了 RunnerScorerDefender 三个 Trait
  • 在测试部分,创建了一个名为 playerPlayer 实例,并调用了它的 runscoredefend 方法,展示了实现类获得了这三个 Trait 中定义的行为。

3.2 对象混入特质

在 Scala 中,对象混入(MixinsTrait 是一种非常强大和灵活的特性,它允许对象在运行时获得 Trait 中定义的行为,而无需继承 Trait 的类。对象混入 Trait 的过程就是 将 Trait 中定义的方法和属性动态地添加到对象中

混入 Trait 可以为对象提供额外的功能,而无需改变其类层次结构。这种灵活性使得在 Scala 中,对象可以非常容易地适应不同的需求,同时保持代码的简洁和可维护性。

/*** 定义队长特质*/
trait Captain {/*** 标识是否为队长*/var isCaptain: Boolean = false/*** 判断 isCaption,输出是否为队长*/def hello(): Unit = {if (isCaptain) println("I am caption") else println("I am not caption")}
}/*** 球员类* @param name 球员姓名*/
class FootballPlayer(val name: String)object App {def main(args: Array[String]): Unit = {// 实例化 FootballPlayer 时,让对象同时拥有 Captain 的相关属性、方法val player = new FootballPlayer("Ronaldo") with Captainplayer.isCaptain = trueplayer.hello()}
}

在这个例子中,使用 对象混入特质 的方式,给 FootballPlayer 对象添加了队长属性。这使得我们可以非常灵活地为对象添加额外的功能,而无需修改类的层次结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/679091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三节 zookeeper基础应用与实战2

目录 1. Watch事件监听 1.1 一次性监听方式:Watcher 1.2 Curator事件监听机制 2. 事务&异步操作演示 2.1 事务演示 2.2 异步操作 3. Zookeeper权限控制 3.1 zk权限控制介绍 3.2 Scheme 权限模式 3.3 ID 授权对象 3.4 Permission权限类型 3.5 在控制台…

Linux中孤儿/僵尸进程/wait/waitpid函数

孤儿进程: 概念:若子进程的父进程已经死掉,而子进程还存活着,这个进程就成了孤儿进程。 为了保证每个进程都有一个父进程,孤儿进程会被init进程领养,init进程成为了孤儿进程的养父进程,当孤儿…

DataBinding简易入门

简介 DataBinding是Google在18年推出的数据绑定框架,采用了MVVM模式来降低各模块之间代码的耦合度,使得整体代码逻辑设计更加清晰。众所周知,MVVM类似于MVC,主要目的是为分离View(视图)和Model&#xff08…

学习之旅10------掌握jQuery:实用应用案例深度解析

目录 写在开头1. jQuery基础知识回顾1.1. 选择器1.2. 事件1.3. 效果1.4. DOM操作1.5. AJAX 2. 实用应用案例分析2.1. 动态内容加载2.2. 表单验证2.3. 图像滑动门效果2.4. 创建动态导航菜单 3. 高级技巧与最佳实践3.1. 优化jQuery代码的性能3.2. jQuery插件的使用和自定义3.3. j…

人工智能在金融领域的革新:挑战与机遇

人工智能在金融领域的应用已经带来了革命性的变化,它不仅提高了金融服务的效率和便利性,也为金融机构提供了更多的数据分析和风险管理工具。然而,人工智能在金融领域的应用也面临着一些挑战,下面将就这些挑战和机遇进行探讨。 挑战…

MATLAB知识点:isempty函数(★★★★☆)判断数组是否为空

​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili 节选自第3章:课后习题讲解中拓展的函数 在讲解第…

rk3568 适配USB

rk3568 适配 USB USB(通用串行总线)是一种常见的电脑外部设备连接标准。它是一种用于连接计算机和外部设备的通信接口。USB接口是一种热插拔技术,能够在计算机运行时插拔设备而无需重启系统。 RK3568 USB接口的最新版本是USB 3.0,它提供了更高的传输速度和更大的带宽。USB…

OpenCV入门:图像处理的基石

在数字图像处理领域,OpenCV(开源计算机视觉库)是一个不可或缺的工具。它包含了一系列强大的算法和函数,使得开发者可以轻松地处理图像和视频数据。本文将带你走进OpenCV的世界,了解其基本概念和常见应用。 1. OpenCV简…

uniapp微信小程序开发踩坑日记:Pinia持久化

如果你使用过Pinia,那你应该知道Pinia持久化插件:https://prazdevs.github.io/pinia-plugin-persistedstate/zh/ 但由于官方文档提供的说明并不是针对小程序开发,所以我们在使用这个插件实现uniapp小程序开发中Pinia持久化会出现问题 我在C…

Rust函数入门与函数重载

在Rust中,函数是一种重要的组织代码的方式,允许开发者将一段特定的功能封装成可重用的模块。本篇博客将介绍Rust中函数的基本概念,并深入探讨函数的重载以及一些常见的函数用法。 函数基础 声明和调用函数 在Rust中,函数的声明…

软考 系统分析师系列知识点之信息系统战略规划方法(6)

接前一篇文章:软考 系统分析师系列知识点之信息系统战略规划方法(5) 所属章节: 第7章. 企业信息化战略与实施 第4节. 信息系统战略规划方法 7.4.4 战略数据规划法 按照詹姆斯.马丁(James Martin)的观点&a…

《统计学简易速速上手小册》第3章:概率分布与抽样技术(2024 最新版)

文章目录 3.1 重要的概率分布3.1.1 基础知识3.1.2 主要案例:顾客到访分析3.1.3 拓展案例 1:产品缺陷率分析3.1.4 拓展案例 2:日销售额预测 3.2 抽样方法与推断3.2.1 基础知识3.2.2 主要案例:顾客满意度调查3.2.2 拓展案例 1&#…

蓝桥杯每日一题------背包问题(二)

前言 本次讲解背包问题的一些延申问题,新的知识点主要涉及到二进制优化,单调队列优化DP,树形DP等。 多重背包 原始做法 多重背包的题意处在01背包和完全背包之间,因为对于每一个物品它规定了可选的个数,那么可以考虑…

【JavaEE】_HTML常用标签

目录 1.HTML结构 2. HTML常用标签 2.1 注释标签 2.2 标题标签:h1~h6 2.3 段落标签:p 2.4 换行标签:br 2.5 格式化标签 2.6 图片标签:img 2.7 超链接标签:a 2.8 表格标签 2.9 列表标签 2.10 表单标签 2.10…

C++继承(二):菱形继承、virtual菱形虚拟继承

目录 一、了解菱形继承 二、菱形继承的问题 三、虚拟继承virtual 3.1virtual 3.2虚拟继承解决数据冗余和二义性的原理 四、总结/继承和组合 一、了解菱形继承 单继承:一个子类只有一个直接父类时称这个继承关系为单继承 多继承:一个子类有两个或…

python-自动化篇-终极工具-用GUI自动控制键盘和鼠标-pyautogui

文章目录 用GUI自动控制键盘和鼠标pyautogui 模块鼠标屏幕位置——移动地图——pyautogui.size鼠标位置——自身定位——pyautogui.position()移动鼠标——pyautogui.moveTo拖动鼠标滚动鼠标 键盘按下键盘释放键盘 开始与结束通过注销关闭所有程序 用GUI自动控制键盘和鼠标 在…

【教学类-48-03】202402011“闰年”(每4年一次 2月有29日)世纪年必须整除400才是闰年)

2000-2099年之间的闰年有25次, 背景需求: 已经制作了对称年月的数字提取,和年月日相等的年份提取 【教学类-48-01】20240205对称的“年”和“月日”(如2030 0302)-CSDN博客文章浏览阅读84次。【教学类-48-01】202402…

专业140+总分410+华南理工大学811信号与系统考研经验华工电子信息与通信,真题,大纲,参考书。

23考研已经落幕,我也成功的上岸华工,回首这一年多的历程,也是有一些经验想和大家分享一下。 首先说一下个人情况,本科211,初试成绩400分。专业课140。 整体时间安排 对于考研,很重要的一环就是时间安排&…

《动手学深度学习(PyTorch版)》笔记8.5

注:书中对代码的讲解并不详细,本文对很多细节做了详细注释。另外,书上的源代码是在Jupyter Notebook上运行的,较为分散,本文将代码集中起来,并加以完善,全部用vscode在python 3.9.18下测试通过&…

python基于flask的网上订餐系统769b9-django+vue

课题主要分为两大模块:即管理员模块和用户模块,主要功能包括个人中心、用户管理、菜品类型管理、菜品信息管理、留言反馈、在线交流、系统管理、订单管理等; 如果用户想要交换信息,他们需要满足双方交换信息的需要。由于时间有限…