首页 > 其他分享 >密封类和密封接口sealed和permits关键字

密封类和密封接口sealed和permits关键字

时间:2023-01-30 23:23:06浏览次数:34  
标签:permits 子类 class 密封 extends sealed final

1.sealed和permits

类和接口上可以添加sealed关键字,用来限定自己可以派生出哪些子类.换句话说,就是控制哪些子类可以继承或者实现自己,不允许其他类派生.

sealed class Base permits D1,D2{}
final class D1 extends Base{}
final class D2 extends Base{}

如上述代码所示,Base只允许D1和D2继承自己,其他类继承会报编译错误.

public sealed interface Ifc {

}

final class Imp1 implements Ifc{}
final class Imp2 implements Ifc{}

子类可以写在不同的文件中.如果子类和父类在同一个文件中,则不需要写permits语句.如上述代码所示,没有写permits关键字,也能正常编译.

2.non-sealed

sealed的子类只能通过final,sealed,non-sealed关键字来定义,如果不加final或者其他关键字,会编译报错.

non-sealed关键字表示允许未知的子类继承被修饰的类.

public sealed class Super permits Sub1, Sub2{

}
final class Sub1 extends Super{}
non-sealed class Sub2 extends Super{}
class Any1 extends Sub2{}
class Any2 extends Sub2{}

如上述代码所示,Sub2在没有permits关键字的情况下也可以被Any1和Any2继承;

3.record

record关键字是隐式的final,所以record也可以不加final继承密封类.

record类似于lombok的@Data注解,可以自己实现equals,toString,hashcode方法等.

用了record关键后,也可以继承密封类.

public sealed interface Employee permits CLevel, Programmer{

}
record CLevel(String type) implements Employee{}
record Programmer(String experience) implements Employee{}

4.getPermittedSubclasses方法

通过反射的getPermittedSubclasses方法我们可以直接获取被允许继承的子类,也就是permits关键字允许的类.

public sealed class Color permits Red,Green,Blue{

}
final class Red extends Color{}
final class Green extends Color{}
final class Blue extends Color{}
public class PermittedSubCLasses {
    public static void main(String[] args) {
        for(var p: Color.class.getPermittedSubclasses()) {
            System.out.println(p.getSimpleName());
        }
    }
}

通过Class<T>类的getPermittedSubclasses方法可以直接获取子类的名称以及其他属性.


 

标签:permits,子类,class,密封,extends,sealed,final
From: https://www.cnblogs.com/lishuaiqi/p/17077508.html

相关文章

  • 单例模式类为什么需要用sealed关键字修饰?
    使用单例设计模式,需要确保在任何给定的时间点对于整个应用程序只有一个特定类的实例可用。使用私有构造函数,可以避免类在外部被实例化,但是却无法避免内部类(嵌套类)的继承,如......
  • 密封圈设计
        ......
  • C#-sealed 封装类的使用
    示例1:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespacesingleton{publicclassmyClass1{///<summary>//......
  • 为什么要把类设置成密封?
    前几天笔者提交了关于FasterKvCache的性能优化代码,其中有一个点就是我把一些后续不需要继承的类设置为了sealed密封类,然后就有小伙伴在问,为啥这个地方需要设置成sealed?提......
  • c#的sealed修饰符
    看书时发现sealed可以阻止类被继承,但是sealed能否作用于方法或者属性呢?答案是肯定的!当sealed用来修饰方法时,只能对派生类使用,这个方法将重写基类的方法,但是该类的派生类......
  • 5 访问修饰符 抽象类 抽象成员 密封类 静态类 扩展方法 命名约定
    目录访问修饰符抽象成员抽象类密封类静态类扩展方法命名约定访问修饰符所有声明在类中的成员都是可见的,无论他们的访问性如何。继承的成员对派生的成员可以是可见的,也......
  • C#-嵌套类匿名类与密封类
    1.嵌套类1.概念在C#中可以将一个类定义在另一个类的内部;外面的类叫“外部类”,内部的类叫“嵌套类”;嵌套类和普通类相似,只是声明的位置比较特殊。2.注意事项如果想实......