百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

你了解封装类和类的继承以及枚举类之间的恩怨纠葛吗?

bigegpt 2024-08-28 12:15 3 浏览

作者:feintkotlin(Kotlin学习网)

说明:文章的内容是基于Kotlin的语法

对与类的继承和枚举类,大家应该都比较熟悉。但咱还是要简单的进行一下说明。

类的继承就好比是泰迪到处播种,生了一群小泰迪,小泰迪有着他爹的性格,又继续去播种。生出更小的泰迪。子子孙孙、无穷无尽。

用专业术语来说就是:子类继承父类,其将会拥有父类所有的可继承成员,并且可以拥有属于自己的方法和属性。对于父类的方法也不用完全生搬硬套,子类可以根据实际需要进行重写。

上面这段话中出现的 可继承成员 是指什么呢?可以继承的成员比较多,我在就列举它的对立面,剩下的就是可继承的成员了。

首先是被 final修饰的成员(包括方法、属性),在Java中final需要显示的进行声明,而在Kotlin中所有的成员默认都是被final修饰的,你要想时某个成员能够被子类继承,则需要使用 open 关键字进行修饰。

第二个是companion object,类似Java中类内部的静态成员。前面也提到了,在kotlin中所用的成员默认都是final的,伙伴对象也不例外,而伙伴对象无法使用open关键字进行修饰,因此也就无法被继承

第三个是父类的私有成员无法被子类继承,这和Java中也是一样的。

类的继承就这样简单的进行了说明,那么,枚举类又是一个怎样的东西呢?你可以把它想象成是一个拥有固定主题的清单。放在里面得东西结构完全相同,各种属性就千差万别了。

在Kotlin中,枚举成员的默认值是他自己的名称,每个枚举成员还有一个编号,可以通过ordinal属性获取到。当然你也可以为成员自定义一些属性,就像下面这个例子一样:

enum class RequestCode(val code:Int,val msg:String){
NOT_FOUND(404,"404 not found"),
SUCCESS(200,"success")
}

说了那么多关于类继承以及枚举类的内容,(其实也不是蛮多,要真的说起来又是几千字的功夫。就不再浪费大家的时间了,都还有几个亿的大项目要做呢。)还是想在之后介绍起封装类的时候,大家能有有一两个比较的对象。

duang!duang!duang!,这场戏的主角登场了。封装类,英文名字:sealed classes。这可是个新鲜东西,在Java里可找不到他的兄弟姐妹呢。你们第一次看到这样一个名字是什么感觉?封装?类本身不就是起封装的作用吗?再加一个封装进行修饰,这究竟是想闹哪样!

封装,在这里所指的是将一个种群聚合到一起,他们都拥有一个相同的父类。这和继承十分的相似,子类继承自父类。写法上的不同点在于父类需要使用 sealed 关键字进行修饰。那么就仅仅是写法上的不同吗?当然不是啦,要不然咱特地写这么一篇文章是为了什么?耍大家伙嘛。

封装类和普通的类继承最大的一点不同在于,封装类的子类数目是有限的,即可列举的。而普通的类继承则是没有数量限制的或者说是不可列举的。在这里咱通过一个Kotlin 中 when 表达式的例子来对普通的类继承和封装类进行一下比较。

fun doOpt(opt:Operator)=when(opt){
is Add->{}
is Miners->{}
}
fun watchView(view:View)=when(view){
is OneView->{}
is TwoView->{}
else -> {}
}
sealed class Operator
class Add:Operator()
class Miners:Operator()
open class View
class OneView:View()
class TwoView:View()

由于封装类是可列举的,因此在when表达式中当你列举完所有的可能之后,便不需要使用 else 了,而普通的类继承是无论如何都要使用的。

在这里还要一点需要向大家所明白,可能大家也注意到了,封装类Operator 并没有使用 open 关键字进行修饰,那为什么,其可以被子类继承呢?其实 封装类sealed classes,本质上是一个抽象类,而抽象类默认是可继承的。

既然封装类的本质是一个抽象类,那么你也可以像下面这样往里面添加抽象方法:

sealed class Operator{
abstract fun work()
}

封装类和枚举类也是十分的相似,他们两都是可列举的。由于封装类是通过类继承的方式进行的实现,因此它所包含的对象可以是不同的类型(都继承至一个相同的父类,并且这个父类被 sealed 关键字所修饰)。而枚举类中的对象都是相同的类型。

说了这么多,我们到底该怎么使用这个封装类,或者说在什么情况下应该使用封装类呢?它应该在那种类似于枚举类,但使用枚举类又不太好实现的场合使用(说了等于没说)。

举个栗子,比如有一个函数,它的其中一个参数是运算的类型,运算方式的种类是有限的,而运算的方式又各不相同。在这样一个场景下,选择封装类是一个更好的选择(尽管普通的类继承也能达到同样的效果)。

最后在用白话文说一遍:如果你所进行的操作,其种类是有限的,并且每一种操作的实现方式各不相同,在这种情况下你应该优先考虑使用封装类。

相关推荐

得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践

一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...

warm-flow新春版:网关直连和流程图重构

本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...

扣子空间体验报告

在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...

spider-flow:开源的可视化方式定义爬虫方案

spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...

solon-flow 你好世界!

solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...

新一代开源爬虫平台:SpiderFlow

SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...

通过 SQL 训练机器学习模型的引擎

关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...

鼠须管输入法rime for Mac

鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...

Go语言 1.20 版本正式发布:新版详细介绍

Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...

iOS 10平台SpriteKit新特性之Tile Maps(上)

简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...

程序员简历例句—范例Java、Python、C++模板

个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...

Telerik UI for iOS Q3 2015正式发布

近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...

ios使用ijkplayer+nginx进行视频直播

上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...

IOS技术分享|iOS快速生成开发文档(一)

前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...

macOS下配置VS Code C++开发环境

本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...