Kotlin语法入门-密封类和密封接口(11)

Kotlin语法入门-密封类和密封接口(11)

文章目录

  • Kotlin语法入门-密封类和密封接口(11)
    • 十一、密封类和密封接口
      • 1、密封类
      • 2、密封接口

十一、密封类和密封接口

1、密封类

  • 在Kotlin中,密封类(Sealed Class)是一种特殊的类,用于表示受限制的类继承结构

  • 密封类可以有子类,但是这些子类必须嵌套在密封类的内部同一个文件中,这样就限制了密封类的继承结构。

  • 密封类通常用于表示有限的类层次结构,例如表示状态的类或操作的类。

密封类的定义方式如下:

sealed class Result
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()

在上面的例子中,Result是一个密封类,它有两个子类Success和Error。这两个子类都嵌套在Result类的内部。由于Result是一个密封类,因此它的子类是有限的,并且都是在同一个文件中定义的。

密封类的特点包括:

  1. 子类有限:密封类的子类是有限的,且必须嵌套在密封类内部或同一个文件中。
  2. 类型推断:使用密封类时,可以通过类型推断来处理所有可能的子类,而不需要使用else语句。
  3. 安全性:密封类提供了更严格的类继承结构,可以帮助开发者避免遗漏某些情况的处理。

使用密封类可以帮助我们更清晰地表示有限的类层次结构,提高代码的可读性和安全性。密封类在处理状态、操作等有限的情况时非常有用。

可以把密封类理解成枚举抽象的结合。

  • 密封类无法实例化,智能继承。

可以使用密封类来模拟登录和登出的操作:

/*** 主函数,程序的入口点。* 实现了用户登录和退出登录的处理。*/
fun main() {// 处理用户登录请求handerMainIntent(MainIntent.Login("李明", "123456"))// 处理用户退出登录请求handerMainIntent(MainIntent.Logout)
}/*** 主意图 sealed 类,用于封装所有主功能的操作。*/
sealed class MainIntent {/*** 用户登录意图数据类。* @param username 用户名。* @param password 密码。*/data class Login(val username: String, val password: String) : MainIntent()/*** 用户退出登录意图。*/object Logout : MainIntent()
}/*** 处理主意图的函数。* 根据传入的 MainIntent 对象执行相应的操作。* @param mainIntent 用户的主意图,可以是登录或退出登录。*/
fun handerMainIntent(mainIntent: MainIntent) {when (mainIntent) {is MainIntent.Login -> userLoginRequest(mainIntent.username, mainIntent.password) // 处理用户登录请求MainIntent.Logout -> println("退出登录.....") // 处理用户退出登录请求}
}/*** 处理用户登录请求的函数。* @param username 用户名。* @param password 密码。* 打印用户登录信息。*/
fun userLoginRequest(username: String, password: String) {println("用户登录:${username} ${password}")
}

2、密封接口

与密封类枚举抽象的结合类似,密封接口就相当于是枚举接口的结合。

下面是一个游戏数据模拟的一段代码:

fun main() {}fun handerHealth(role: Weapon) {when (role) {is PlayerType1 -> println("玩家1")is PlayerType2 -> println("玩家2")is PlayerType3 -> println("玩家3")is EnemyType1 -> println("敌人1")is EnemyType2 -> println("敌人2")is EnemyType3 -> println("敌人3")}
}
fun handerWeapon(role: Weapon) {when (role) {is PlayerType1 -> println("玩家1")is PlayerType2 -> println("玩家2")is PlayerType3 -> println("玩家3")is EnemyType1 -> println("敌人1")is EnemyType2 -> println("敌人2")is EnemyType3 -> println("敌人3")}
}sealed interface Health {}
sealed interface Weapon {}
class PlayerType1 : Health, Weapon
class PlayerType2 : Health, Weapon
class PlayerType3 : Health, Weapon
class EnemyType1 : Health, Weapon
class EnemyType2 : Health, Weapon
class EnemyType3 : Health, Weapon

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

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

相关文章

蓝牙低能耗安全连接 – 数值比较

除了 LE Legacy 配对之外,LE Secure Connections 是另一种配对选项。 LE 安全连接是蓝牙 v4.2 中引入的增强安全功能。它使用符合联邦信息处理标准 (FIPS) 的算法(称为椭圆曲线 Diffie Hellman (ECDH))来生成密钥。对于 LE 安全连接&#xff…

永恒之蓝ms17-010的利用

永恒之蓝ms17-010的利用 实验环境: Kali虚拟机:攻击机 Win7虚拟机:目标机 主要工具:metasploit ##获取meterpreter 使用关键字17-010在metasploit中查找 msf5 > search 17-010Matching Modules # Name …

android Java工程配置kotlin环境

在Android项目中配置Kotlin,你需要执行几个步骤来确保你的Java工程可以混合使用Kotlin代码。以下是一个基本的指南: 添加Kotlin插件 首先,你需要在你的Android项目中添加Kotlin插件。这通常在你的build.gradle(项目级别&#xff…

图像处理技术与应用(二)

图像处理技术与应用入门 椒盐噪声 椒盐噪声,也称为脉冲噪声,是一种常见的数字图像噪声。它通常表现为图像中随机出现的白色(椒)或黑色(盐)像素点,这些像素点在图像上呈现为黑白杂点。椒盐噪声…

算法项目(9)—— 大模型实现PDF检索加QA

本文包含什么? 使用大语言模型进行多个PDF问答检索加QA.gradio实现的网页界面操作,全套代码以及代码介绍运行有问题? csdn上后台随时售后.项目说明 本项目实现使用大语言模型为核心,gradio框架,调用vicuna实现多个pdf QA 代码运行 python3 main.pyimport gradio as gr fr…

云计算革新:以太网 Scale-UP 网络为 GPU 加速赋能

谈谈基于以太网的GPU Scale-UP网络 Intel Gaudi-3 采用 RoCE 互联技术,促进了 Scale-UP 解决方案。业界专家 Jim Keller 倡导以太网替代 NVLink。Tenstorrent 成功应用以太网实现片上网络互联。RoCE 和以太网已成为互联解决方案的新兴趋势,为高性能计算提…

视频中为什么需要这么多的颜色空间?

在视频处理中,经常会用到不同色彩空间:非线性RGB,线性 RGB,YUV,XYZ……为什么需要这么多的色彩空间呢? 1、视频采集时的线性RGB颜色空间 由数码相机中的 CMOS 传感器产生并写入原始文件(Raw Fil…

艾瑞泽5汽车电子控制单元CAN通信数据读写车辆网络系统交互接口

艾瑞泽5的网关接口数据交换通常涉及车辆内部电子设备之间的信息传输,包括车身系统、娱乐系统、远程控制、车辆状态监控、CAN数据采集分析、整车DBC控制策略等信息。 艾瑞泽5作为一款采用CAN协议的汽车,其CAN通信的开发可以提高车辆的安全性、可靠性和实…

怎么设置 idea terminal 窗口的编码格式

1 修改Terminal 窗口为 Git bash 窗口 打开 settings 设置界面,选择 Tools 中的 Terminal (File -> settings -> Tools -> Terminal) 修改 Shell path 为你的 Git bash 安装路径,我的在 C:\my_software\java\Git\bin\bash.exe 2 解决中文显示…

uniapp 阿里云点播 视频播放

以下是uniapp 阿里云点播(不加密) 注意: 对于UNI APP端的开发而言,由于上并没有document 不能进行相关的DOM操作,同时有关DOM渲染的第三方库(echart、openlayer等)也无法有效的使用, 因此官方推出了renderj…

1003 - 编程求1+3+5+...+n

题目描述 编程求 135 \dots n135⋯n 。 输入 输入一行&#xff0c;只有一个整数 n (1 \le n \lt 10000)n(1≤n<10000) 这里 nn 为奇数。 输出 输出只有一行。 样例 输入 99 输出 2500 #include<bits/stdc.h> using namespace std; int main(){int m,s0;cin…

抢单业务介绍

存在的问题 会出现多个人同时访问的问题 解决办法&#xff1a;在判断前加锁&#xff0c;使用户在抢单前先访问锁然后在执行之后的操作 常见的锁 1.基于数据库 2.基础缓存(Redis等) 3.基于Zookeeper

windows 本地部署 ChatGLM2-6b 教程

介绍 ChatGLM2-6B是智谱AI及清华KEG实验室发布的中英双语对话模型&#xff0c;它是 ChatGLM-6B 的第二代版本。 主要特点&#xff1a; 性能提升&#xff1a;ChatGLM2-6B 在初代模型的基础上进行了全面升级&#xff0c;使用了 GLM 的混合目标函数&#xff0c;并经过了 1.4T 中…

Opencv | 直方图

这里写目录标题 一. 直方图方法1方法2方法3 二. 掩码区域的直方图绘制 一. 直方图 方法1 cv.calcHist(images, channels, mask, histSize, rangesNone, accumulateFalse)参数:images: 输入图像&#xff0c;可以是单个图像或图像的列表channels: 计算直方图的通道对于灰度图像&…

小白学习SpringCloud之Eureka

前言 需要搭建springcloud项目&#xff0c;eureka是其中的一个模块&#xff0c;依赖主要继承父依赖 学习视频&#xff1a;b站狂神说 便于理解,我修改了本地域名》这里!!! 127.0.0.1 eureka7001.com 127.0.0.1 eureka7002.com 127.0.0.1 eureka7003.comEureka入门案例 eureka…

API提取IP

API代理作为IP代理的一项重要业务&#xff0c;在绕开地域网络限制&#xff0c;提高作业效率等方面提供强大的技术支持。它能够帮助用户快速实现软件与软件间的交流&#xff0c;无障碍连通不同应用程序逻辑开发的系统应用。API代理用途范围广泛&#xff0c;如使用API提取代理IP、…

Linux:web服务基于IP和域名部署

Linux&#xff1a;web服务基于IP和域名部署 配置基于IP的虚拟主机 # 添加两个IP [rootserver100 ~]# ip addr add 172.25.254.10/24 dev eth0 [rootserver100 ~]# ip addr add 172.25.254.20/24 dev eth0# 这个命令是专门用来查看IP信息的 [rootserver100 ~]# ip addr 1: lo:…

02-JVM学习记录-运行时数据区

二、运行时数据区 每个JVM只有一个Runtime实例&#xff0c;只有一个运行时数据区。 虚拟机栈、堆、方法区最重要 方法区和堆与虚拟机的生命周期相同&#xff08;随虚拟机启动而创建&#xff0c;虚拟机退出而销毁&#xff09;&#xff0c;程序计数器、虚拟机栈、本地方法栈生命…

区块链技术与应用学习笔记(12-13节)——北大肖臻课程

目录 12.BTC-匿名性 一、什么是匿名&#xff1f; 1&#xff0c;有可能破坏比特币匿名性的两个方面 2&#xff0c;如何提高匿名性 一个比特币用户能采用什么样的方法尽量提高个人的匿名性? 分解&#xff1a; 1、网络层怎么提高匿名性? 2、应用层怎么提高匿名性? 零知…

2024年vue 开发环境 Node.js于win10环境下的安装

2024年vue 开发环境 Node.js于win10环境下的安装 导航 文章目录 2024年vue 开发环境 Node.js于win10环境下的安装导航一、下载node.js二、安装node.js三、测试(一)四、环境配置五、测试(二)六、安装淘宝镜像七、安装vue脚手架 一、下载node.js Node.js 官方网站下载&#xff…