溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Kotlin如何創(chuàng)建接口或者抽象類

發(fā)布時(shí)間:2021-06-07 11:35:01 來源:億速云 閱讀:458 作者:小新 欄目:移動(dòng)開發(fā)

這篇文章給大家分享的是有關(guān)Kotlin如何創(chuàng)建接口或者抽象類的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

一 ,定義接口和抽象類

interface IPerson{
 //獲取名字
 fun getName():String
 //獲取身份證ID
 fun getID():String
}

abstract class BaseAnimal{
 abstract fun getVoice():String
}

二,創(chuàng)建對(duì)應(yīng)的匿名對(duì)象

 object : IPerson {
   override fun getName(): String = "jason"
   override fun getID(): String = "00000123"
  }
 
  object : BaseAnimal() {
   override fun getVoice() = "旺旺叫"
  }

補(bǔ)充知識(shí):android Kotlin 繼承、派生、接口、構(gòu)造方式,方法、屬性重寫

前言

kotlin 作為google官方android 開發(fā)語言,大勢所趨,據(jù)傳到2018底kotlin要全面替代java在android中的地位,其實(shí)這個(gè)也不擔(dān)心畢竟kotin和java可以100%互操作。兩種語言進(jìn)行編寫也是可以的。

Kotlin 繼承

1.使用 open 關(guān)鍵字進(jìn)行修飾

2.主構(gòu)造函數(shù)緊跟著在類后面聲明的函數(shù)

open class Person(var name : String, var age : Int){// 基類

}

class Student(name : String, age : Int, var no : String, var score : Int) : Person(name, age) {

}

// 二級(jí)構(gòu)造函數(shù)

calss Student : Person {

 constructor(ctx: Context) : super(ctx) {
 } 

 constructor(ctx: Context, attrs: AttributeSet) : super(ctx,attrs) {
 }
}

另一種寫法,基類構(gòu)造函數(shù),次級(jí)構(gòu)造函數(shù)

/**用戶基類**/
open class Person(name:String){
 /**次級(jí)構(gòu)造函數(shù)**/
 constructor(name:String,age:Int):this(name){
  //初始化
  println("-------基類次級(jí)構(gòu)造函數(shù)---------")
 }
}

/**子類繼承 Person 類**/
class Student:Person{

 /**次級(jí)構(gòu)造函數(shù)**/
 constructor(name:String,age:Int,no:String,score:Int):super(name,age){
  println("-------繼承類次級(jí)構(gòu)造函數(shù)---------")
  println("學(xué)生名: ${name}")
  println("年齡: ${age}")
  println("學(xué)生號(hào): ${no}")
  println("成績: ${score}")
 }
}

fun main(args: Array<String>) {
 var s = Student("Runoob", 18, "S12345", 89)
}

方法重寫

基類fun函數(shù)默認(rèn) final 修飾符,無法在子類進(jìn)行重寫

需要加上 open 修飾符號(hào)

方法獲得,同名方法獲得

一個(gè)類從其他類或者接口(繼承實(shí)現(xiàn)來的方法),同名方法,在子類中必須顯示進(jìn)行調(diào)用

 open class A {
 open fun f () { print("A") }
 fun a() { print("a") }
}

interface B {
 fun f() { print("B") } //接口的成員變量默認(rèn)是 open 的
 fun b() { print("b") }
}

class C() : A() , B{
 override fun f() {
  super<A>.f()//調(diào)用 A.f()
  super<B>.f()//調(diào)用 B.f()
 }
}

fun main(args: Array<String>) {
 val c = C()
 c.f();
}

 open class A {
 open fun f () { print("A") }
 fun a() { print("a") }
}

interface B {
 fun f() { print("B") } //接口的成員變量默認(rèn)是 open 的
 fun b() { print("b") }
}
class C() : A() , B{
 override fun f() {
  super<A>.f()//調(diào)用 A.f()
  super<B>.f()//調(diào)用 B.f()
 }
}
fun main(args: Array<String>) {
 val c = C()
 c.f();
}

屬性重寫

屬性重寫使用 override 關(guān)鍵字,屬性必須具有兼容類型,每一個(gè)聲明的屬性都可以通過初始化程序或者getter方法被重寫:

open class Foo {
 open val x: Int get { …… }
}
class Bar1 : Foo() {
 override val x: Int = ……
}

你可以用一個(gè)var屬性重寫一個(gè)val屬性,但是反過來不行。因?yàn)関al屬性本身定義了getter方法,重寫為var屬性會(huì)在衍生類中額外聲明一個(gè)setter方法

你可以在主構(gòu)造函數(shù)中使用 override 關(guān)鍵字作為屬性聲明的一部分:

interface Foo {
 val count: Int
}
class Bar1(override val count: Int) : Foo
class Bar2 : Foo {
 override var count: Int = 0
}

Kotlin 接口

Kotlin 接口與 Java 8 類似,使用 interface 關(guān)鍵字定義接口,允許方法有默認(rèn)實(shí)現(xiàn):

interface MyInterface {
 fun bar() // 未實(shí)現(xiàn)
 fun foo() { //已實(shí)現(xiàn)
  // 可選的方法體
  println("foo")
 }
}

接口中的屬性

接口中的屬性只能是抽象的,不允許初始化值,接口不會(huì)保存屬性值,實(shí)現(xiàn)接口時(shí),必須重寫屬性:

interface MyInterface{
 var name:String //name 屬性, 抽象的
}

class MyImpl:MyInterface{
 override var name: String = "runoob" //重載屬性
}

函數(shù)重寫

實(shí)現(xiàn)多個(gè)接口時(shí),可能會(huì)遇到同一方法繼承多個(gè)實(shí)現(xiàn)的問題。例如:

實(shí)例

interface A {
 fun foo() { print("A") } // 已實(shí)現(xiàn)
 fun bar()     // 未實(shí)現(xiàn),沒有方法體,是抽象的
}

interface B {
 fun foo() { print("B") } // 已實(shí)現(xiàn)
 fun bar() { print("bar") } // 已實(shí)現(xiàn)
}

class C : A {
 override fun bar() { print("bar") } // 重寫
}

class D : A, B {
 override fun foo() {
  super<A>.foo()
  super<B>.foo()
 }

 override fun bar() {
  super<B>.bar()
 }
}

fun main(args: Array<String>) {
 val d = D()
 d.foo();
 d.bar();
}

輸出結(jié)果為:

ABbar

實(shí)例中接口 A 和 B 都定義了方法 foo() 和 bar(), 兩者都實(shí)現(xiàn)了 foo(), B 實(shí)現(xiàn)了 bar()。因?yàn)?C 是一個(gè)實(shí)現(xiàn)了 A 的具體類,所以必須要重寫 bar() 并實(shí)現(xiàn)這個(gè)抽象方法。

然而,如果我們從 A 和 B 派生 D,我們需要實(shí)現(xiàn)多個(gè)接口繼承的所有方法,并指明 D 應(yīng)該如何實(shí)現(xiàn)它們。

這一規(guī)則 既適用于繼承單個(gè)實(shí)現(xiàn)(bar())的方法也適用于繼承多個(gè)實(shí)現(xiàn)(foo())的方法。

感謝各位的閱讀!關(guān)于“Kotlin如何創(chuàng)建接口或者抽象類”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI