如何区分kotlin的类继承(在Java中扩展)和接口实现(在中的实现),在这里kotlin对两者都使用(:)?

时间:2018-08-22 18:15:15

标签: java kotlin

当我在某个kotlin项目的中间工作时,我感到困惑,例如子类是实现另一个父类还是实现接口?就像我从jar中使用了一些我不太了解的接口和类一样,由于我是kotlin的新手,有人可以向我解释解决此问题的方法。
例如:
类定义

abstract class Employee (val firstName: String, val lastName: String) {
    abstract fun earnings(): Double
}

由其他一些类扩展

abstract class Employee (val firstName: String, val lastName: String) {
    // ... 

    fun fullName(): String {
        return lastName + " " + firstName;
    }
}

类似的界面

class Result
class Student 

interface StudentRepository {
    fun getById(id: Long): Student
    fun getResultsById(id: Long): List<Result>
}

接口实现

class StudentLocalDataSource : StudentRepository {
    override fun getResults(id: Long): List<Result> {
       // do implementation
    }

    override fun getById(id: Long): Student {
        // do implementation
    }
}

2 个答案:

答案 0 :(得分:5)

在Kotlin中,要从一个类继承,您必须编写其主要构造函数,因此您总是会看到父类,后跟(),有时里面有东西。

接口不需要此。您只需编写接口的名称即可。

因此,如果在名称后看到方括号,则为父类。否则它是一个接口。

答案 1 :(得分:1)

考虑以下示例:

abstract class Employee(val firstName: String, val lastName: String) {
    abstract fun earnings(): Double
}

interface Hireable {
    fun hire()
}

class HireableEmployee(firstName: String, lastName: String) : Employee(firstName, lastName), Hireable {
    override fun earnings(): Double {
        return 10000.0
    }

    override fun hire() {
        //...
    }
}

您可以看到父类是通过构造函数调用Employee(firstName, lastName)声明的,接口声明Hireable后面带有 no 括号。

因此在Kotlin中,extends对应于名称后面的(),表示这是构造函数调用,因此是父类。 implements没有特殊的语法,只有名称。

有关接口的更多信息,请参见https://kotlinlang.org/docs/reference/interfaces.html

关于类层次结构,请参见https://kotlinlang.org/docs/reference/classes.html