19:kotlin 类和对象 -- 密封类和接口(Sealed classes and interfaces )

使用sealed关键字声明一个密封类或者接口

sealed interface Errorsealed class IOError(): Error

密封类和接口能够很好的控制继承,在密封类和接口定义的模块和包外无法被继承

在编译期我们就已知了所有的密封类和接口的实现类。在某种意义上,密封类类似于枚举类:枚举类型的值集也是受限制的,但枚举常量只存在为单个实例,而密封类的子类可以有多个实例,每个实例都有自己的状态。

举例来说,有个公共方法模块,定义了一个顶级错误密封类Error,只要是模块中捕获了Error的子类异常,就证明是当前模块抛出的错误,可以根据子类类型分别作出不同的处理。如果不是密封类,其他模块也继承了Error类,因为不是在当前模块定义的,被当前模块捕获后没有相应的处理方式,可能导致运行异常。因为密封类的特性,所有子类型都是已知的,不会被其他模块继承,避免了上述未知异常

上述情况需要直接子类不能为open类型才能完美实现

package com.examplesealed interface Error 
class CustomError() : Error 
package io.exampleimport com.example.Errorclass CustomError(): Error // 报错 -- Inheritor of sealed class or interface declared in package io.example but it must be in package com.example where base class is declared

注意上边例子的包名,在其他io包下继承密封类报错

密封类本身是抽象类,不能直接实例化,可以有抽象成员

密封类的构造函数可以是protected或者private,默认为protected

sealed class IOError {constructor() { /*...*/ } // 默认protectedprivate constructor(description: String): this() { /*...*/ } // private// public constructor(code: Int): this() {} // 报错 -- Error: public and internal are not allowed
}

直接子类位置(Location of direct subclasses)

  • 直接子类必须在相同的包内声明。
  • 子类可以是顶层类,也可以嵌套在任意数量的其他命名类、命名接口或命名对象内。
  • 子类可以具有任何可见性,只要它们符合kotlin的正常继承规则。
  • 密封类的子类必须具有正确的限定名称。
  • 子类不能是局部的,也不能是匿名对象

枚举不能继承密封类,但是能实现密封接口

这些限制不适用于间接子类。如果密封类的直接子类没有标记为密封类,那么它可以根据其修饰符允许的任何方式进行扩展

sealed interface Error // has implementations only in same package and modulesealed class IOError(): Error // extended only in same package and module
open class CustomError(): Error // can be extended wherever it's visible

多平台继承

在以后章节中讲解

密封类和When表达式

使用密封类的主要好处是在when表达式中使用它们时发挥作用。如果可以验证语句涵盖所有情况,则不需要在语句中添加else子句

fun log(e: Error) = when(e) {is FileReadError -> { println("Error while reading file ${e.file}") }is DatabaseError -> { println("Error while reading from database ${e.source}") }is RuntimeError ->  { println("Runtime error") }// the `else` clause is not required because all the cases are covered
}

when expressions on expect sealed classes in the common code of multiplatform projects still require an else branch. This happens because subclasses of actual platform implementations aren’t known in the common code.

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

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

相关文章

qt 安装

目录 前言 一、QT在线安装包下载 1.官方网站: 2.镜像(清华大学) 二、QT安装 1.更换安装源 2.安装界面 3.组件选择(重点) 参考 Qt2023新版保姆级 安装教程 前言 本文主要介绍2023新版QT安装过程,…

12.4_黑马MybatisPlus笔记(下)

目录 11 12 thinking:关于Mybatis Plus中BaseMapper和IService? 13 ​编辑 thinking:CollUtil.isNotEmpty? 14 thinking:Collection、Collections、Collector、Collectors? thinking:groupBy&#…

回顾Django的第五天

1.多表操作 1.1基于对象的跨表查询 正向查询(按字段:publish) # 查询主键为1的书籍的出版社所在的城市 book_objBook.objects.filter(pk1).first() # book_obj.publish 是主键为1的书籍对象关联的出版社对象 print(book_obj.publish.city)…

浅谈对SSH的理解

ssh框架指的是Spring Struts2 and Hibernate,Spring可以理解为绿草丛,负责通过配置文件或注解管理组件之间的依赖关系,并提供了高效的事务管理功能,其出色的ioc和aop面向切面编程可以织入增强,并且具有很多spring注解可以减轻配置…

【Virtual Box】显示界面后无反应

本文记录本人在使用Virtual Box中遇到的问题 1.Virtual Box启动后无反应点击菜单栏是可用的,但界面里的无法操作 【解决方法】:以管理员身份启动virtual Box

数据结构 第5 6 章作业 图 哈希表 西安石油大学

第6章 图 1.选择题 (1)在一个图中,所有顶点的度数之和等于图的边数的( )倍。 A.1/2 B.1 C.2 D.4 答案&#xff1a…

算法通关村第十六关|白银|滑动窗口经典

1.最长子串 1.1 无重复字符的最长子串 原题&#xff1a;力扣3. 使用 HashMap &#xff0c;将字符和最后一次出现的索引存储起来。 public int lengthOfLongestSubstring(String s) {if (s.length() 0) {return 0;}HashMap<Character, Integer> map new HashMap<…

js数组合并的方法,以及各方法的区别

需求 array1 [1,2,3] array2 [4,5,6] 合并俩数组 打印结果为 [1,2,3,4,5,6] 思路 方法一 使用concat()方法 concat()方法可以将多个数组合并成一个新数组&#xff0c;不会修改原始数组。 优点 它可以合并任意数量的数组&#xff0c;并且可以在合并时添加新的元…

【云备份】客户端模块

33. 客户端数据管理模块实现-数据信息设计 客户端要实现的功能是对指定文件夹中的文件自动进行备份上传。但是并不是所有的文件每次都需要上传&#xff0c;我们需要能够判断&#xff0c;哪些文件需要上传&#xff0c;哪些不需要&#xff0c;因此需要将备份的文件信息给管理起来…

linux 命令 tmux 用法详解

一、tmux 解决的痛点&#xff08;screen命令一样可以解决&#xff0c;但是tmux功能更强大&#xff09; 痛点一&#xff1a;大数据传输的漫长一夜 相信做过 Linux 服务运维的同学&#xff0c;都用 scp 进行过服务器间的大文件网络传输。一般这需要很长的时间&#xff0c;这期间…

自动化集成有哪些典型应用场景?

为什么要做自动化场景集成&#xff1f; 主要分为以下几点&#xff1a; 提高效率/减少错误&#xff1a;减少人工操作、人为错误、人力成本&#xff0c;提高生产效率、生产质量和稳定性。 提高可靠性&#xff1a;提高系统的可靠性和稳定性&#xff0c;减少系统故障和停机时间。…

【云备份】项目介绍

1. 云备份认识 自动将本地计算机上指定文件夹中需要备份的文件上传备份到服务器中。并且能够随时通过浏览器进行查看并且下载&#xff0c;其中下载过程支持断点续传功能&#xff0c;而服务器也会对上传文件进行热点管理&#xff0c;将非热点文件进行压缩存储&#xff0c;节省磁…

golang使用es,报错Elasticsearch health check failed

今天golang代码里调用es&#xff0c;结果一直报错。报错内容 ElasticsearchRestHealthIndicator : Elasticsearch health check failed然后又去es管理端看&#xff0c;明明节点是绿色的&#xff0c;估计是golang的这个有问题&#xff0c;时间紧迫&#xff0c;我就直接关掉了健…

【网络安全】-《网络安全法》制定背景和核心内容

文章目录 1. 背景介绍1.1 数字时代的崛起1.2 中国网络安全形势 2. 《网络安全法》核心内容2.1 法律适用范围2.2 个人信息保护2.3 关键信息基础设施保护2.4 网络安全监管和应急响应2.5 网络产品和服务安全管理2.6 法律责任和处罚 3. 法律的意义和影响3.1 维护国家安全3.2 保护个…

易石无代码开发:电商平台连接CRM与客服系统,实现营销自动化

易石无代码开发的优势 易石软件以其强大的无代码开发平台&#xff0c;为电商企业提供了一种全新的业务集成手段。在激烈的市场竞争中&#xff0c;电商平台必须不断优化其运营效率和客户服务质量。易石无需复杂的API开发&#xff0c;通过简单的配置就能实现电商平台与CRM、客服…

翻硬币(第四届蓝桥杯省赛C++B组)(java版)

//翻硬币,每次都会改变两个硬币的状态 //因此我们可以从前往后枚举,s1[i] 与 s2[i] 状态不同就改变它的状态 //同时s1[i 1] 与 s2[i 1] 的状态会因此改变 // 所以继续往下枚举s1[i 1] 与 s2[i 1] //因为题目有说必须有解,因此枚举到 n - 1位的时候&#xff0c;两个字符串的…

微软推出AI助手Copilot的正式版本;ChatGPT:七位研究人员分享他们的观点

&#x1f989; AI新闻 &#x1f680; 微软推出AI助手Copilot的正式版本 摘要&#xff1a;微软宣布其AI助手Copilot正式上线&#xff0c;此前Copilot的预览版已成为很多用户的日常AI伴侣。此次上线后&#xff0c;Copilot将继续提供AI驱动的网络聊天体验&#xff0c;并具备商业…

Linux:dockerfile编写搭建mysql练习(10)

搭建了httpyum仓库 Dockerfile 主要文件 基于centos基础镜像 centos.repo yum仓库 db_init.sh mysql初始化脚本 run.sh 启动脚本 vim Dockerfile写入FROM centosMAINTAINER teacher lyRUN mkdir /etc/yum.repos.d/bak ; mv /etc/yu…

深入了解Java Period类,对时间段的精确控制

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概2900多字&#xff0c;预计阅读时间长需要3分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…

上机实验四 哈希表设计 西安石油大学数据结构

实验名称&#xff1a;哈希表设计 &#xff08;1&#xff09;实验目的&#xff1a;掌握哈希表的设计方法及其冲突解决方法。 &#xff08;2&#xff09;主要内容&#xff1a; 已知一个含有10个学生信息的数据表&#xff0c;关键字为学生“姓名”的拼音&#xff0c;给出此表的一…