Kotlin 类2 - 抽象类与接口
1. Kotlin 类、抽象类、接口的规则:
- 「单继承多现实」即一个类只可以继承一个父类,但可以实现多个接口;
 
- 「继承实现后使用」抽象类和接口不能直接创建对象,都需要被子类继承实现后,用子类进行创建;
 
- 父类(接口)变量可以接受子类(实现类)的实例赋值;
 
2. 接口
- 接口中可以定义属性,但是不能初始化,也不能有 getter/setter 方法,但是在它的实现类中必须被实现;
 
- 可以给接口函数创建默认实现(在它的实现类中可以不必实现该函数);
 
- 对于抽象函数,必须在它的实现类中给出该函数的实现;
 
interface A {
    /* 1. 接口中可以定义属性,但是不能初始化,也不能有 getter/setter 方法,但是在它的实现类中必须被实现;
     */
    var a: Int
    /* 2. 可以给接口函数创建默认实现(在它的实现类中可以不必实现该函数);
     */
    fun printA() {
        println("a --> $a")
    }
    /* 3. 对于抽象函数,必须在它的实现类中给出该函数的实现;
     */
    fun printA1()
}
/* A1. 接口A 的实现类必须实现其父接口已经定义过的 属性a;
 */
class implA(override var a: Int) : A {
    /* A3. 接口A 的实现类必须实现其父接口的 抽象函数printA1();
     */
    override fun printA1() {
    }
}
3. 抽象类
- 可以定义属性,同时属性也可以赋初始值;
 
- 可以创建函数以及函数体,也可以输出类所对应的属性;
 
- 与接口一样,对于抽象的函数,必须在其实现类中给出该函数的实现;
 
abstract class B {
    /* 1. 可以定义属性,同时属性也可以赋初始值;
     */
    var b = 10
    /* 2. 可以创建函数以及函数体,也可以输出类所对应的属性;
     */
    fun printB() {
        println(b)
    }
    /* 3. 与接口一样,对于抽象的函数,必须在其实现类中给出该函数的实现;
     */
    abstract fun printB1()
}
class implB : B() {
    /* B3. 抽象类B 的实现类必须实现其父类的 抽象函数printB1();
     */
    override fun printB1() {
    }
}