Kotlin 继承和接口

一、Kotlin中类的继承

在Java中,类基于Object,而在Kotlin中类基于Any,所有类都默认继承Any。kotlin中的类默认是final类型的,不可被继承,想要作为基类被继承必须使用open关键字修饰。

对于没有超类型声明的类默认超类是Any,Any类只有三个函数~


package kotlin

public open class Any {
   
    public open operator fun equals(other: Any?): Boolean

    public open fun hashCode(): Int

    public open fun toString(): String
}

二、子类对构造函数的实现

1.当子类中有构造函数,则基类必须在主构造函数中立即初始化

open class S(name: String, age: Int) { //基类

}

//子类中有构造函数,则基类必须在主构造函数中立即初始化
class SS(var name: String, val age: Int, val score: Int) : S(name, age) {

}
fun main(args: Array<String>) {
    val s = SS("Tina", 20, 60)
    println("学生名:${s.name}")
    println("年龄:${s.age}")
    println("成绩:${s.score}")

}
学生名:Tina
年龄:20
成绩:60

2.当子类中没有主构造函数时,则必须每一个次要构造函数或代理另一个构造函数中用 super 关键字初始化基类。初始化基类时,可以使用super来调用基类的不同构造函数。

open class Personal(name: String) {
    constructor(name: String, age: Int) : this(name) {
        //初始化
        println("---基类次级构造函数-----")
    }
}

class SrudentImpl : Personal {
    constructor(name: String, age: Int, no: String, score: Int, likely: String) : super(name, age) {
        println("----- 继承类的次级构造函数 ------")
        println("学生名:${name}")
        println("年龄:${age}")
        println("学生号:${no}")
        println("成绩:${score}")
    }
}
fun main(args: Array<String>) {
    var student = SrudentImpl("Mikle", 18, "12485684", 98, "唱歌")
}
学生名:Mikle
年龄:18
学生号:12485684
成绩:98

3.方法的重写

基类中,使用fun声明函数时,该函数默认是final修饰的,不能被子类重写。如果允许该函数能被重写,则需手动添加open修饰它,子类复写使用override关键词。

open class D {
    open fun study() {  //允许子类重写的方法
        println("基类DD中定义需被子类重写的方法")
    }
}

class DD : D(), F {
    override fun study() {
        println("子类重写了父类的方法~~~")
        super<D>.study()
        super<F>.study()
    }
}

interface F {
    fun study() {  //允许子类重写的方法
        println("接口F中定义的方法~~")
    }
}

4.属性重写:使用override关键字

interface Foo {
    val count: Int
}

//属性的复写使用override关键字
class Bar1(override val count: Int) : Foo {}

class Bar2 : Foo {
    override var count: Int = 0
}

三、Kotlin中接口的实现

使用关键字interface定义接口,一个类可实现一个或多个接口

interface MyInterface {
    val name:String  //接口中的属性只能是抽象的,不允许初始化值,实现接口,必须重写属性
    fun bar()
    fun foo()
}

class Child: MyInterface {
    override var name:String="我是复写的name属性"  //重写属性
    override fun foo() {
        println("调用了foo方法")
    }

    override fun bar() {
       println("调用了bar方法")
    }
}

fun main(args: Array<String>) {
    val c = Child()
    c.foo()
    c.bar()
    println(c.name)
}
调用了foo方法
调用了bar方法
我是复写的name属性

***当实现多个接口时,可能会遇到同一方法继承多个实现的问题。

interface A {
    fun foo() {
        println("A")
    }  //有方法体,代表已经实现

    fun bar() //无方法体,是抽象的,未实现,需要被子类重写
}

interface B {
    fun foo() {
        println("B") //已实现
    }

    fun bar() {
        println("bar") //已实现
    }
}

class C : A {
    override fun bar() {
    }
}

class H : A, B {
    override fun bar() {
        super<B>.bar()
    }

    override fun foo() {
        super<A>.foo()
        super<B>.foo()
    }
}

fun main(args: Array<String>) {
   val h=H()
    h.foo()
    h.bar()
}
调用了foo方法
调用了bar方法
我是复写的name属性

 

 

好的,下面是一个简单的示例: 首先,创建一个继承自Dialog类的Kotlin类,例如CustomDialog,然后实现Dialog中的方法: ```kotlin import android.app.Dialog import android.content.Context import android.os.Bundle import android.view.View import android.view.Window import kotlinx.android.synthetic.main.custom_dialog.* class CustomDialog(context: Context) : Dialog(context), View.OnClickListener { private var listener: OnCustomDialogListener? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) requestWindowFeature(Window.FEATURE_NO_TITLE) setContentView(R.layout.custom_dialog) btn_confirm.setOnClickListener(this) btn_cancel.setOnClickListener(this) } override fun onClick(v: View) { when (v.id) { R.id.btn_confirm -> { listener?.onConfirm() dismiss() } R.id.btn_cancel -> { listener?.onCancel() dismiss() } } } fun setOnCustomDialogListener(listener: OnCustomDialogListener) { this.listener = listener } interface OnCustomDialogListener { fun onConfirm() fun onCancel() } } ``` 在这个类中,我们定义了一个OnCustomDialogListener接口,该接口有两个方法onConfirm和onCancel,分别对应确认和取消按钮的点击事件。我们还在onCreate方法中设置了dialog的布局文件,并为确认和取消按钮设置了点击事件。 接下来,在res/layout目录下创建custom_dialog.xml文件,定义dialog的布局,例如: ```xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp"> <TextView android:id="@+id/tv_title" android:text="这是一个自定义Dialog" android:textSize="20sp" android:textColor="@android:color/black" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center"/> <View android:layout_marginTop="16dp" android:layout_marginBottom="16dp" android:layout_width="match_parent" android:layout_height="1dp" android:background="@android:color/darker_gray"/> <TextView android:id="@+id/tv_message" android:text="这是一个自定义Dialog的消息" android:textSize="16sp" android:textColor="@android:color/black" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center"/> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp"> <Button android:id="@+id/btn_cancel" android:text="取消" android:textColor="@android:color/white" android:background="@drawable/bg_btn_cancel" android:layout_weight="1" android:layout_width="0dp" android:layout_height="wrap_content"/> <Button android:id="@+id/btn_confirm" android:text="确认" android:textColor="@android:color/white" android:background="@drawable/bg_btn_confirm" android:layout_weight="1" android:layout_width="0dp" android:layout_height="wrap_content"/> </LinearLayout> </LinearLayout> ``` 在这个布局文件中,我们定义了一个包含标题、消息和确认取消按钮的LinearLayout,并为确认和取消按钮设置了样式和点击事件。 最后,在Activity或Fragment中使用CustomDialog: ```kotlin val dialog = CustomDialog(this) dialog.tv_title.text = "提示" dialog.tv_message.text = "这是一个自定义Dialog" dialog.setOnCustomDialogListener(object : CustomDialog.OnCustomDialogListener { override fun onConfirm() { // 点击确认按钮的逻辑 } override fun onCancel() { // 点击取消按钮的逻辑 } }) dialog.show() ``` 在这个示例中,我们首先创建了一个CustomDialog实例,并设置了标题、消息和点击事件。然后,我们使用setOnCustomDialogListener方法设置了OnCustomDialogListener接口,当用户点击确认或取消按钮时,CustomDialog会回调相应的方法。最后,我们调用show方法显示dialog。 至此,一个简单的自定义Dialog就完成了。当然,你可以根据自己的需求修改CustomDialog的样式和逻辑。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值