首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Kotlin】Kotlin Sealed 密封 ( 密封声明 | 密封子类定义 | 密封特点 | 代码示例 )

密封作用 : 定义一密封 , 该类只能有有限指定的子类 , 不能在其它文件定义其它类型子类 ; 2 ...., 枚举的每个类型只能存在一实例 , 而密封的每个类型可以创建无数个实例 ; II ....子类声明 : 密封的子类 , 必须定义在密封的内部 ; ( 1.1 之后的版本可以定义在同一文件中 ) sealed class Student { class GoodStudent...密封子类 : ① 定义在密封内部 ( 推荐 ) : 密封的子类建议定义在密封内部 , 可以兼容所有版本 ; ② 定义在密封所在文件 : Kotlin 1.1 以后的版本 , 可以将密封子类定义在密封声明的同一文件中...() //打游戏 studentAction(badStudent) } /** * 根据不同的类型执行不同的方法 */ fun studentAction(student :

1.3K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Kotlin Vocabulary | 密封 sealed class

    /video/BV1Nk… 密封的基本使用 和抽象类似,密封可用于表示层级关系。...子类可以是任意的: 数据、Kotlin 对象、普通的,甚至也可以是另一密封。但不同于抽象的是,您必须把层级声明在同一文件中,或者嵌套在的内部。...使用 when 语句处理密封时,如果没有覆盖所有情况,可以让编译器给我们一错误提示。...,所以 IDE 可以帮我们补全 when 语句下的所有分支: 当涉及到一层级复杂的密封时,这个功能会显得更加好用,因为 IDE 依然可以识别所有的分支: sealed class Result<out...Result 是一抽象,并且包含两构造方法: 一私有的默认构造方法合成构造方法,只有 Kotlin 编译器可以使用 这意味着其他的无法直接调用密封的构造方法

    1.2K10

    Java中密封的介绍

    今天将给大家介绍一下Java中的密封。 Sealed是Java武器库中的一新引入(JDK17)。由于这一添加,在Java编程语言中的关键字集合中添加了另一关键字。...作为一补充,继承是一种面向对象的特性,其中继承的扩展了其父的特性或功能。这增强了可重用性。子类继承父的质量(字段、方法和嵌套),并可以通过多态性和函数重载添加自己的质量。...Java中的密封声明如下: public sealed class A permits B, C { //... } 在这个代码示例中,A可由B和C继承——或允许继承;没有其他可以继承它。...B {} // 喏,现在可以继承了 现在,假设我们希望A由B和C扩展,我们也希望D扩展B,但我们不希望D声明为final、非密封密封,那么我们可以按如下方式设计: Public sealed...密封和子类必须位于同一命名模块中,尽管它们可以位于不同的包中。 对于未命名的模块,密封和子类必须在同一包中。 Java中的密封接口 密封接口的声明方式与密封几乎相同。

    1.2K10

    学习记录——抽象密封

    ①抽象 C#允许把和函数声明为abstract,抽象不能实例化,抽象可以包含普通函数和抽象函数,抽象函数就是只有函数定义,没有函数体。...如果将看做是模板,那么抽象就是一不完整的模板,我们不能使用不完整的模板去构造对象。 抽象成员 通过在定义前面放置关键字 abstract,可以将声明为抽象。...例如,库可以定义一抽象,将其用作多个库函数的参数,并要求使用该库的程序员通过创建派生来提供自己的实现。 抽象也可以定义抽象方法。...②密封 密封成员 通过在定义前面放置关键字 sealed,可以将声明为密封。...由于密封从不用作基,所以有些运行时优化可以略微提高密封成员的调用速度。 在对基的虚成员进行重写的派生上,方法、索引器、属性或事件可以将该成员声明为密封成员。

    37131

    Java(接口)的新类型——密封

    密封是Java 17正式支持的一新特性,它让Java中的继承可以更加细粒度的进行控制。今天就来认识一下这个新的功能。...如果一功能只允许出现在Phone和Pad上,不允许出现在Computer上。如果不对该功能的继承实现进行限制,开发人员将很容易滥用该功能的实现,错误地重用一些代码。这就是密封产生的原因。...但是下面是一错误的密封声明: /** * 这是一错误的示范 */ public sealed interface SealedService { void doSomething...下面是正确的写法: /** * 这是一正确的示范,明确了可继承的子类为{@link SealedServiceImpl} * 该密封接口同时实现了{@link SuperService} */...implements SealedService { @Override public void doSomething() { System.out.println("这是一密封子类

    1.4K00

    【JDK15 新特性】密封

    背景 在 Java 中如果想让一不能被继承和修改,这时我们应该使用 final 关键字对进行修饰。...新特性 通过密封和接口来限制超的使用,密封和接口限制其它可能继承或实现它们的其它或接口。 具体使用: 使用修饰符sealed,可以将一声明为密封。...密封使用保留关键字permits列出可以直接扩展(即extends)它的。...final:子类为finall,间接表示父不能被其他继承 sealed:子类也可以声明为密封 non-sealed:声明为非密封,可以被其他继承 举例: public abstract sealed...//子类也是一密封 public non-sealed class Square extends Shape {...} //non-sealed表示子类不是一密封,可以被任何继承

    45430

    为什么要把设置成密封

    前几天笔者提交了关于FasterKvCache的性能优化代码,其中有一点就是我把一些后续不需要继承的设置为了sealed密封,然后就有小伙伴在问,为啥这个地方需要设置成sealed?...提交的代码如下所示: 一般业务开发的同学可能接触密封类比较少,密封除了框架设计约束(不能被继承)以外,还有一微小的性能提升,不过虽然它是一微小的优化点,多框架开发的作者都会做这样的优化,如果方法调用的频次很高...我们可以看到 JIT 生成后的汇编代码,可以很清楚的看到密封少了两条指令,因为 JIT 可以从密封中知道它不可能被继承,也不可能被重写,所以是直接跳转到密封类目标方法执行,而非密封还有一查表的过程...IL 层面,两方法都是一模一样: 可以看到密封的代码相当高效,直接比较一下就转换类型返回了,而非密封还需要 call 方法走查表流程: 数组 .NET 的数组是协变的,协变兼容的话就意味着在添加进入数组时需要检查它的类型...的原因显而易见: 为了让的职责更加清晰,在设计中没有计划让它有派生 为了性能的提升,JIT 优化可以让其方法调用更快 还有更多有趣的东西(比如 IDE 智能提示将设置为密封,如何使用 dotnet

    32920

    Java 17 更新(8):密封终于转正

    Java 看 Kotlin 实现了密封,马上给自己搞了密封密封接口,Kotlin 一看也立马支持了密封接口。...Kotlin 从 1.0 开始就有密封,并且对子类定义位置的限制从父内部(Kotlin 1.0)到同一文件(Kotlin 1.1)再到同一包内(Kotlin 1.5),但实际使用上没有什么特别大的变化...密封实际上也是一很有用的特性,我之前在介绍 Kotlin 的密封的时候也已经提到过不少它的用法,感兴趣的小伙伴可以看一下这个视频: 就像视频当中提到的那样,我们可以用密封实现递归列表: public...接下来我们还可以给它添加一些有趣的方法,让它更像一 List: public sealed interface List { ......为了方便创建 List 的实例,我们再给它添加一便捷的方法: public sealed interface List { ...

    1.5K10

    【Kotlin】常用的 Kotlin ② ( 枚举 | 枚举定义函数 | 密封 )

    文章目录 一、枚举 二、枚举定义函数 1、枚举定义普通函数 2、枚举定义构造函数 三、密封 一、枚举 ---- Kotlin 中使用 枚举 定义常量 , 枚举定义格式如下 : 枚举常量...枚举的 常量名称 ; MALE true 枚举的常量 Gender.MALE 是 Gender 的一 实例对象 ; 二、枚举定义函数 ---- 在枚举中 , 可以 定义函数 , 包括 普通函数...和 构造函数 ; 1、枚举定义普通函数 通过 枚举 的 类型常量 ( 实例对象 ) 可以 调用 枚举中定义的方法 ; 为枚举定义普通函数 : 在枚举 Gender 中定义了 log 函数 ,...main() { Gender.MALE.log() Gender.FEMALE.log() } 执行结果 : Gender, MALE 0, FEMALE 1, id = 0 三、密封...---- 枚举类型 是一组 子类型 闭集 ; 密封 可以 定义 枚举类型的 子类型闭集 , 一密封可以有多个子类 , 继承密封的子类 必须 与 密封在相同的 Kotlin 代码文件中 ; 密封适用于这种情况

    1.1K10

    Kotlin中级(9)- - - Kotlin之数据密封、内部类.md

    (Koltin要修改数据的属性,则使用其独有的copy()函数。其作用就是:修改部分属性,但是保持其他不变) 密封 1....但是,我们知道Kotlin的枚举中的枚举常量是受限的,因为每一枚举常量只能存在一实例 但是其和枚举不同的地方在于,密封的一子类可以有可包含状态的多个实例。...也可以说成,密封是包含了一组受限的集合,因为里面的都是继承自这个密封的。但是其和其他继承(open)的区别在,密封可以不被此文件外被继承,有效保护代码。...当然说到内部类,就必须提到另一概念,嵌套,所谓嵌套:即指一可以嵌套在其他中。...一般的使用方式为定义一接口,在接口中定义一方法

    1.1K20

    详解 Java 17中的新特性:“密封

    Sealed Classes有两种主流翻译:密封、封闭。个人喜欢前者多一些,所以在本文中都称为密封。...其实Sealed Classes的其他许多语言中并不是什么新鲜事物,C#、Scala等高级语言中都有类似的名称,但意义和作用各不相同。...而密封的作用就是限制的继承。...新手段:密封 为了进一步增强限制能力,Java 17中的密封增加了几个重要关键词: sealed:修饰/接口,用来描述这个/接口为密封/接口 non-sealed:修饰/接口,用来描述这个.../接口为非密封/接口 permits:用在extends和implements之后,指定可以继承或实现的 下面我们通过一例子来理解这几个关键词的用法,更多Java新特性,欢迎关注Java前沿专栏,

    70730

    CA2119:密封满足私有接口的方法

    规则说明 接口方法具有公共可访问性,实现类型不能对其进行更改。 internal 接口创建一协定,该协定不应在定义接口的程序集的外部实现。...如果定义程序集中的第二种类型调用该方法并需要仅限内部的协定,当在外部程序集中执行重写方法时,行为可能会受到影响。 这会造成安全漏洞。...在不使用 virtual 修饰符的情况下实现方法。 显式实现方法。 何时禁止显示警告 如果仔细检查后,不存在在程序集外部重写此方法时可能会被利用的安全问题,则可禁止显示此规则的警告。...End If End Sub End Class 示例 2 下面的示例利用上一示例的虚拟方法实现。...End If End Sub End Class 另请参阅 接口 (C#) 接口 (Visual Basic)

    30300

    Android面试之5Kotlin深度面试题:协程、密封和高阶函数

    例如,可以为View添加一扩展函数来简化View的显示和隐藏: fun View.show() { this.visibility = View.VISIBLE } fun View.hide...} }) } 然后可以像这样使用这个高阶函数: recyclerView.onItemClick { position -> // 处理点击事件 } 面试题目4:Kotlin中的密封...如何在Android开发中使用密封? 解答: 密封是一种特殊的,它限制了子类的数量。密封的所有子类都必须在同一文件中定义。密封通常用于表示受限的层次结构,例如状态机或结果类型。...密封的定义方式如下: sealed class Result { data class Success(val data: String) : Result() data class...Error(val error: Throwable) : Result() object Loading : Result() } 在Android开发中,密封可以用于表示网络请求的结果状态

    15210

    Groovy 孵化功能-记录record和密封sealed的学习

    简单理解就是,原先java中将参数传进方法或者中,只是一浅拷贝。而添加@Immutable之后,可以将入参进行深拷贝。 两者之间已经不是一对象了。...密封-sealed关键字 密封、接口和特性(traits)限制了哪些子类可以扩展/实现它们。在密封出现之前,层次结构设计者有两主要选择: 设置一关键字为final不允许扩展。...将设为public和非final,以允许任何人扩展。 与这些要么全有要么全无的选择相比,密封提供了一中间地带。 密封也比以前用于实现中间地带的其他技巧更灵活。...创建一不可变的Hexagon 继承Polygon final class Hexagon extends Polygon { } //创建一密封,继承Shape 仅许可Square sealed...然后创建的Rectangle是密封的,只允许一种控制的方法进行扩展就是Square。 密封用于创建类似枚举的相关,这些需要包含特定于实例的数据。

    92120

    C++】构建第一C++:Date

    private: int _year; int _month; int _day; }; Date默认成员函数 Date构造函数 C++中一包含6默认成员函数,如下:...对于的六默认成员函数还不了解的朋友可以移步: 【C++】的六大默认成员函数及其特性(万字详解) 综上所述,对于日期中的6默认成员函数,我们只需要自己实现一下构造函数即可...:【C++】的六大默认成员函数及其特性(万字详解) 其中有关于运算符重载的入门级详解: 判断日期变量大于 判断日期变量的大小,其算法逻辑可以分为四步骤,即: 先判断年是否大于...综上,根据算法逻辑以及C++语言特性,判断日期变量大于函数如下: bool Date::operator>(const Date& x) const { if (_year > x....我们采用方法二,则先在里声明该友元函数,然后就可以直接正常使用了,声明如下: class Date { //友元函数流插入和流提取的函数声明 friend ostream& operator

    9610

    C++大小和静态成员方法

    大小计算 空的大小为1字节 一中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用对象的存储空间的 字节对齐的问题。...与C语言一致 没有继承的时候,存在虚函数则需要加上虚指针vptr(+4字节),如果有多个也只需要加上一,因为只有一虚指针。...虚基指针:如果是虚继承,则子类的大小为:虚基的大小 + 4字节(用来存放指向虚基对象的指针)+子类新增成员的大小。...sizeof(C):x的大小,y的大小,m的大小,存在虚函数则有vptr;虚继承,则还存在指向虚基指针。而基也是虚继承,基中也有一指向虚基指针。...<<C::b<<endl; return 0; } 静态方法 静态方法可以被直接调用,但是同静态变量一样符合public、private、protect特性 静态成员函数不可以调用的非静态成员

    72250

    C#中的方法和属性

    这节讲C#中的方法,属性。这是面向对象编程中,我们最直接打交道的三结构。...(class)是面向对象中最基本的单元,它是一种抽象,对现实世界中事物的抽象,在C#中使用class关键字声明一: class MyClass{} 既然是一抽象,我们使用的时候就要对其进行实例化...每个都有一构造方法(constructor),构造方法的名字必须跟名一致(我们实例的时候就是调用的这个方法),如果不显式声明的构造方法,系统就会默认生成一无参的构造方法。...方法是可以重载的,所谓重载,就是一中可以存在相同方法名的方法C#中,方法名和参数列表组成一方法签名,重载一方法,只需要修改方法签名中的参数列表即可。...另外,C#5推出了一新的语法糖:自动属性:以上代码就可以变化为这样: public bool IsFiled{get;set;} 自动属性无法对数据做处理,CLR自动生成私有字段,只负责对字段的获取或修改

    2K30
    领券