| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
hbsz51zyqc
7年前发布

Kotlin——继承

   <p style="text-align:center"><img src="https://simg.open-open.com/show/567921b0e9bf28619d3d346fd2975aac.jpg"></p>    <p>Kotlin中所有的类都有一个公有的超类:Any,这是所有没有声明超类的类的默认父类。</p>    <pre>  <code class="language-kotlin">class Example //隐式继承自Any   </code></pre>    <p>Any!=Java.lang.Object。尤其,除了equals()、hashCode()和toString()三个方法外,没有任何成员。</p>    <p>为了显式地声明超类,语法如下:</p>    <pre>  <code class="language-kotlin">open class Base(p:Int)      class Derived(p:Int):Base(p)   </code></pre>    <p>如果类具有主构造器,则可以使用主构造器的参数(并且必须)初始化父类。</p>    <p>如果类没有主构造器,那么每个辅助构造器初始化时需要使用super关键字,或者将其委托给其他构造器。需要注意的是,在这种情况下,不同的辅助构造器可以调用基类的不同构造器。</p>    <pre>  <code class="language-kotlin">class MyView:View{      constructor(ctx:Context):super(ctx)      constructor(ctx:Context,attrs:AttributeSet):super(ctx,attrs)      }   </code></pre>    <p>open注解和Java的final相反:它允许其他类继承自该类。默认的,Kotlin中所有的类是final的,也就是说不能继承的。</p>    <h2>覆写方法</h2>    <p>Kotlin总是做一些明确的事情,不像Java,Kotlin要求复写方法时需要显式的注解和重写:</p>    <pre>  <code class="language-kotlin">open class Base {       open fun v() {           println("Base.v()")       }          fun nv() {           println("Base.nv")       }      }      class Derived() : Base() {          override fun v() {           println("Derived.v()")       }      }   </code></pre>    <p>复写Derived的v()时,ovverride注解是必须的,否则编译器会报错。如果没有open注解,比如Base的nv(),那么在子类中是不能覆写该方法的。在一个final类中(没有open注解声明),open成员是禁止的。也就是说final类的每个成员也都是final的。</p>    <p>一个标记为override的成员自身就是open的,子类仍然可以覆写它。如果你想禁止覆写,那么使用final</p>    <pre>  <code class="language-kotlin">open class AnotherDerived() : Base() {       final override fun v() {           println("AnotherDerived.v")       }   }   </code></pre>    <p>最后,main()验证多态性:</p>    <pre>  <code class="language-kotlin">fun main(args: Array<String>) {          var base1: Base = Base()       var base2: Base = Derived()       var base3: Base = AnotherDerived()          base1.v()       base2.v()       base3.v()      }   </code></pre>    <h2>覆写属性</h2>    <p>覆写属性和覆写方法基本类似;如果子类要重新声明父类中已经声明过的属性,那么需要使用override,并且类型要兼容。每个声明的属性可以被具有初始化器的属性或具有getter方法的属性覆盖。</p>    <pre>  <code class="language-kotlin">open class Foo {       open val x: Int           get() {               println("Foo")               return 3           }   }      class Bar1 : Foo() {       override val x: Int = 2   }   </code></pre>    <p>可以使用var属性覆盖val属性,反之不可以。因为val属性基本上声明一个getter方法,并将其替换为var,另外在派生类中声明一个setter方法。</p>    <p>可以在主构造器使用override覆盖属性</p>    <pre>  <code class="language-kotlin">interface Aoo {       val count: Int   }      class Aoo1(override val count: Int) : Aoo      class Aoo2 : Aoo {       override var count: Int = 0   }   </code></pre>    <h2>覆写准则</h2>    <p>在Kotlin中,实现继承由以下规则控制:如果类从其直接超类继承同一成员的多个实现,则它必须覆盖该成员并提供自己的实现(可能使用其中一个继承)。 要表示从其继承的实现的超类型,可在尖括号中使用超类型名称超级限定,例如,super。</p>    <pre>  <code class="language-kotlin">open class A {       open fun f() {           println("A")       }          fun a() {           println("a")       }      }      //接口的方法默认open   interface B {       fun f() {           println("B")       }          fun b() {           println("b")       }      }      class C() : A(), B {       override fun f() {           super<A>.f()           super<B>.f()           println("C")       }   }   </code></pre>    <p>上面的代码继承自A和B是没有问题的,a()和b()因为C知道继承自哪一个类。但是对于f(),我们有两个继承,所以我们需要覆写f(),并且需要提供我们的实现来消除歧义。</p>    <h2>总结</h2>    <p>Kotlin中的类默认是final的,如果需要子类继承,需要使用open修饰;</p>    <p>Kotlin中的方法默认是不允许复写的,只有用open修饰时,子类才可以进行覆写,并且需要使用override进行显示标注</p>    <p>属性也支持覆写</p>    <p> </p>    <p>来自:http://developer.51cto.com/art/201708/547047.htm</p>    <p> </p>    
 本文由用户 hbsz51zyqc 自行上传分享,仅供网友学习交流。所有权归原作者,若您的权利被侵害,请联系管理员。
 转载本站原创文章,请注明出处,并保留原始链接、图片水印。
 本站是一个以用户分享为主的开源技术平台,欢迎各类分享!
 本文地址:https://www.open-open.com/lib/view/open1501771204372.html
Kotlin