zoukankan      html  css  js  c++  java
  • 一手遮天 Android

    项目地址 https://github.com/webabcd/AndroidDemo
    作者 webabcd

    一手遮天 Android - kotlin: 类相关 2(类继承,接口,抽象类)

    示例如下:

    /kotlin/Demo8.kt

    /**
     * 本例用于演示类继承,接口,抽象类
     */
    
    package com.webabcd.androiddemo.kotlin
    
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import com.webabcd.androiddemo.R
    import kotlinx.android.synthetic.main.activity_kotlin_helloworld.*
    
    class Demo8 : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_kotlin_demo8)
    
            sample1() // 类继承
            sample2() // 接口
            sample3() // 抽象类
        }
    
        fun sample1() {
            var a = Demo8_Class1(40);
            appendMessage(a.hello()) // hello:wanglei, age:40, country:china
    
            var b = Demo8_Class2(40, "中国");
            appendMessage(b.hello()) // hi:wanglei, age:80, country:中国
        }
    
        fun sample2() {
            var a = Demo8_Class3(40)
            appendMessage(a.hello()) // hello:wanglei, age:40 hi:wanglei, age:40
        }
    
        fun sample3() {
            var a = Demo8_Class4("wanglei")
            appendMessage(a.hello()) // hello:wanglei, age:100, country:china
        }
    
    
        fun appendMessage(message: String) {
            textView1.append(message)
            textView1.append("
    ")
        }
    }
    

    kotlinDemo8_Class1.kt

    /**
     * 父类(用于演示类继承)
     *
     * 可被继承的类要用 open 修饰(默认是 final 的,即不可继承)
     * 可被重写的属性或方法要用 open 修饰(默认是 final 的,即不可重写)
     */
    
    package com.webabcd.androiddemo.kotlin
    
    open class Demo8_Class1(var age: Int) {
    
        init {
            this.age = age
        }
    
        open var name = "wanglei"
    
        open var country = "china"
    
        open fun hello(): String {
            return "hello:$name, age:$age, country:$country"
        }
    }
    

    kotlinDemo8_Class2.kt

    /**
     * 子类(用于演示类继承)
     */
    
    package com.webabcd.androiddemo.kotlin
    
    // 通过 : 继承父类,调用父类的主构造函数
    // 通过类似如下 override var country: String 的方式重写父类的属性
    // 注:这个类也可以被继承,因为他用 open 修饰了,如果需要这个类不可以被继承,就把 open 去掉,那么就是默认 final 了,就不能被继承了
    open class Demo8_Class2(age: Int, override var country: String) : Demo8_Class1(age * 2) {
    
        // 如下方式,通过 super 调用非主构造函数
        // constructor(country: String): super(country)
    
        // 属性在父类中是 val,那么是可以在子类中改用 var 修饰的
        // 属性在父类中是 var,那么是不能在子类中改用 val 修饰的
    
        // 重写属性
        // 注:父类中 name 是 open 的,所以如果某个类继承了这个类,那么其是可以重写此属性的,如果不想这样,那么这里就要用 final 修饰,类似这样 final override var name...
        override var name = "wanglei"
    
        // 重写方法
        // 注:父类中 hello() 是 open 的,所以如果某个类继承了这个类,那么其是可以重写此方法的,如果不想这样,那么这里就要用 final 修饰,类似这样 final override fun hello(): String...
        override fun hello(): String {
    
            // 通过 super 调用父类的属性或方法
            // super.name
            // super.hello()
    
            return "hi:$name, age:$age, country:$country"
        }
    }
    
    

    kotlinDemo8_Class3.kt

    /**
     * 实现类(用于演示接口)
     *
     * 接口的方法可以有自己的实现,但是属性不可以有自己的实现(需要子类实现)
     */
    
    package com.webabcd.androiddemo.kotlin
    
    // 通过 : 实现多个接口
    // 通过类似如下 override var age: Int 的方式实现接口的属性
    class Demo8_Class3(override var age: Int) : Demo8_Interface1, Demo8_Interface2 {
    
        init {
            this.age = age;
        }
    
        // 实现接口的属性
        override var name: String = ""
            get() = "wanglei"
    
        // 实现接口的方法
        override fun hello(): String {
    
            // 通过 super 调用接口的方法
            // super.hello()
    
            // 如果实现的多个接口有重名的方法,则可以用如下方式调用不同接口的方法
            return super<Demo8_Interface1>.hello() + " " + super<Demo8_Interface2>.hello()
        }
    }
    

    kotlinDemo8_Class4.kt

    /**
     * 子类(用于演示抽象类)
     */
    
    package com.webabcd.androiddemo.kotlin
    
    // 通过 : 继承抽象类
    // 通过类似如下 override var name: String 的方式重写抽象类的抽象属性
    class Demo8_Class4(override var name: String) : Demo8_Abstract() {
    
        init {
            this.name = name
        }
    
        // 重写抽象类的抽象属性
        override var country = "china"
    
        // 重写抽象类的抽象方法
        override fun getAge(): Int {
            return 100;
        }
    }
    

    kotlinDemo8_Abstract.kt

    /**
     * 抽象类(用于演示抽象类)
     */
    
    package com.webabcd.androiddemo.kotlin
    
    abstract class Demo8_Abstract {
    
        // 需要子类重写的属性
        abstract var name:String
    
        // 需要子类重写的属性
        abstract var country:String
    
        // 需要子类重写的方法
        abstract fun getAge(): Int
    
        // 有自己逻辑的方法,不需要子类重写
        fun hello(): String {
            return "hello:$name, age:${getAge()}, country:$country"
        }
    }
    
    

    /layout/activity_kotlin_demo8.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
    </LinearLayout>
    
    

    项目地址 https://github.com/webabcd/AndroidDemo
    作者 webabcd

  • 相关阅读:
    <style>的scope属性
    scrollIntoView的使用
    需要学习的内容列表
    react生命周期
    JS对象-不可扩展对象、密封对象、冻结对象
    神策埋点
    Django初识
    MySQL的sql_mode模式说明及设置
    MySQL的逻辑查询语句的执行顺序
    MySQL行(记录)的详细操作
  • 原文地址:https://www.cnblogs.com/webabcd/p/android_kotlin_Demo8.html
Copyright © 2011-2022 走看看