美文网首页
Kotlin定义类继承结构

Kotlin定义类继承结构

作者: Ryan_Hoo | 来源:发表于2018-07-05 21:50 被阅读0次

1.1、kotlin中的接口

它与Java8中的相似:可以包含抽象方法以及非抽象方法的实现,不能包含任何状态。使用interface关键字声明。

接口和实现一个接口

interface  Clickable{ fun click()  }

class   Button :Clickable{  override  fun  click() = println("clicked")}


冒号代替JAVA中的extends和implements关键字。使用override修饰符是强制要求。

1.2、如果实现的两个接口中有相同方法名的方法,调用时用super<基类>.方法。

例如接口Clickable和Focusable中都有showOff(),调用 super<Clickable>.showOff() super<Focusable>.showOff()


1.3、open、final、abstract修饰符:默认final  ------ 控制继承的修饰符

Kotlin中的类和方法默认都是final的,如果你想允许创建子类需要使用open修饰符来标示这个类;允许重写方法,使用open标示方法。abstract类不能被实例化。抽象成员始终是open的

不需要子类中被重写的类和方法应该显示的标注为final

1.4、可见性修饰符:默认public

可见性修饰符:protected 、private、public 。Java中省略修饰符默认为protected ,而Kotlin中为public 。

private 只在该类(以及它的成员)中可见+

protected 和 private 一样但在子类中也可见

internal 在本模块的所有可以访问到声明区域的均可以访问该类的所有 internal 成员(不同包情况下,protected的成员不能访问,internal成员能访问)

public 任何地方可见

例子:

internal open class TalkativeButton :Focusable{

      private fun yell() = println("Hey!")

      protected fun   whisper() = println("Let's talk !")

      fun get(){ val inner = InnerClass() ; inner.str = "100" ;} //错误,不能看到内部类的private成员

      class InnerClass{ private val str = "" }

}

/*下面的调用是错误的*/

fun TalkativeButton.giveSpeech(){    //错误

     yell()     //错误

     whisper()   //错误

}

//调用

fun  talkShow(button : TalkativeButton){

      button. giveSpeech()

}


giveSpeech()是扩展函数。TalkativeButton是接收者,他的类型为internal,而giveSpeech是public,Kotlin禁止从public函数去引用低可见的类型。在引用类型时 , 从本例子可见 giveSpeech()和talkShow(button)都和类有关,在可见性上要和类的可见性相同或者低于类的可见性。Kotlin中,protected成员只在类和他的子类中可见,类的扩展函数不能访问它的private和protected成员。一个外部类不能看到其内部类中的private成员 。

1.5、内部类和嵌套类 : 默认嵌套类

Kotlin的嵌套类不能访问外部类的实例,除非你特别地做出了要求。Kotlin中没有显示修饰符的嵌套类和Java中的static嵌套类是一样的。要是嵌套类变为内部类需要使用inner修饰符 。

图1   Java和Kotlin嵌套类和内部类的对应关系

引用外部内需要使用this@类名从Inner类去访问Outer类。

class  OuterClass{ inner class Inner{fun getOuterRef() : OuterClass= this@OuterClass}}

1.6、密封类:定义受限的类继承结构

sealed修饰符修饰的父类对可能创建的子类做出了严格的限制,所有的子类必须嵌套在父类中。

package ch04.ex1_5_2_SealedClasses1

sealed class Expr {

     class Num(val value: Int) : Expr()

     class Sum(val left: Expr, val right: Expr) : Expr()

}

fun eval(e: Expr): Int =

          when (e) {

                is Expr.Num -> e.value

                is Expr.Sum -> eval(e.right) + eval(e.left)

          }

}

当你在when中使用sealed类并且添加一个新的子类时,又返回值的when表达式会导致编译失败。

sealed修饰符隐含的这个类是一个open类,不需要再显示添加open。

相关文章

网友评论

      本文标题:Kotlin定义类继承结构

      本文链接:https://www.haomeiwen.com/subject/lgniyftx.html