牵引车厂家
免费服务热线

Free service

hotline

010-00000000
牵引车厂家
热门搜索:
技术资讯
当前位置:首页 > 技术资讯

看一看:Kotlin——继承

发布时间:2022-04-02 10:26:01 阅读: 来源:牵引车厂家
Kotlin——继承 作者:佚名 2017-08-03 15:54:50 开发 后端 在Kotlin中,实现继承由以下规则控制:如果类从其直接超类继承同一成员的多个实现,则它必须覆盖该成员并提供自己的实现(可能使用其中一个继承)。 要表示从其继承的实现的超类型,可在尖括号中使用超类型名称超级限定。

Kotlin中所有的类都有一个公有的超类:Any,这是所有没有声明超类的类的默认父类。

  1. classExample//隐式继承自Any

Any!=Java如果农村楼房被强拆怎么办.lang.Object。尤其,除了equals()、hashCode()和toString()三个方法外,没有任何成员。

为了显式地声明超类,语法如下:

  1. openclassBase(p:Int)
  2. classDerived(p:Int):Base(p)

如果类具有主构造器,则可以使用主构造器的参数(并且必须)初始化父类。

如果类没有主构造器,那么每个辅助构造器初始化时需要使用super关键字,或者将其委托给其他构造器。需要注意的是,在这种情况下,不同的辅助构造器可以调用基类的不同构造器。

  1. classMyView:View{
  2. constructor(ctx:Context):super(ctx)
  3. constructor(ctx:Context,attrs:AttributeSet):super(ctx,attrs)
  4. }

open注解和Java的final相反:它允许其他类继承自该类。默认的,Kotlin中所有的类是final的,也就是说不能继承的。

覆写方法

Kotlin总是做一些明确的事情,不像Java,Kotlin要求复写方法时需要显式的注解和重写:

  1. openclassBase{
  2. openfunv(){
  3. println("Base.v()")
  4. }
  5. funnv(){
  6. println("Base.nv")
  7. }
  8. }
  9. classDerived():Base(){
  10. overridefunv(){
  11. println("Derived.v()")
  12. }
  13. }

复写Derived的v()时,ovverride注解是必须的,否则编译器会报错。如果没有open注解,比如Base的nv(),那么在子类中是不能覆写该方法的。在一个final类中(没有open注解声明),open成员是禁止的。也就是说final类的每个成员也都是final的。

一个标记为override的成员自身就是open的,子类仍然可以覆写它。如果你想禁止覆写,那么使用final

  1. openclassAnotherDerived():Base(){
  2. finaloverridefunv(){
  3. println("AnotherDerived.v")
  4. }
  5. }

***农村违建归哪个部门管理,main()验证多态性:

  1. funmain(args:Array<String>){
  2. varbase1:Base=Base()
  3. varbase2:Base=Derived()
  4. varbase3:Base=AnotherDerived()
  5. base1.v()
  6. base2.v()
  7. base3.v()
  8. }

覆写属性

覆写属性和覆写方法基本类似;如果子类要重新声明父类中已经声明过的属性,那么需要使用override,并且类型要兼容。每个声明的属性可以被具有初始化器的属性或具有getter方法的属性覆盖。

  1. openclassFoo{
  2. openvalx:Int
  3. get(){
  4. println("Foo")
  5. return3
  6. }
  7. }
  8. classBar1:Foo(){
  9. overridevalx:Int=2
  10. }

可以使用var属性覆盖val属性,反之不可以。因为val属性基本上声明一个getter方法,并将其替换为var,另外在派生类中声明一个setter方法。

可以在主构造器使用override覆盖属性

  1. interfaceAoo{
  2. valcount:Int
  3. }
  4. classAoo1(overridevalcount:Int):Aoo
  5. classAoo2:Aoo{
  6. overridevarcount:Int=0
  7. }

覆写准则

在Kotlin中,实现继承由以下规则控制:如果类从其直接超类继承同一成员的多个实现,则它必须覆盖该成员并提供自己的实现(可能使用其中一个继承)。 要表示从其继承的实现的超类型,可在尖括号中使用超类型名称超级限定,例如,super。

  1. openclassA{
  2. openfunf(){
  3. println("A")
  4. }
  5. funa(){
  6. println("a")
  7. }
  8. }
  9. //接口的方法默认open
  10. interfaceB{
  11. funf(){
  12. println("B")
  13. }
  14. funb(){
  15. println("b")
  16. }
  17. }
  18. classC():A(),B{
  19. overridefunf(){
  20. super<A>.f()
  21. super<B>.f()
  22. println("C")
  23. }
  24. }

上面的代码继承自A和B是没有问题的,a()和b()因为C知道继承自哪一个类。但是对于f(),我们有两个继承,所以我们需要覆写f(),并且需要提供我们的实现来消除歧义。

总结

Kotlin中的类默认是final的,如果需要子类继承,需要使用open修饰;

Kotlin中的方法默认是不允许复写的,只有用open修饰时,子类才可以进行覆写,并且需要使用override进行显示标注

属性也支持覆写