kotlin 接口中的最终方法

Dim*_*ski 3 kotlin

正如标题所述,我正在寻找一种在 kotlin 接口中实现 Final(无法重写的方法)的方法。所以这是我的代码:

interface NewsItemState {

    final fun delete(newsItem: NewsItem) {
        validateCanDelete(newsItem)
        deleteNewsItem(newsItem)
    }

    fun validateCanDelete(newsItem: NewsItem)
    fun deleteNewsItem(newsItem: NewsItem)
}
Run Code Online (Sandbox Code Playgroud)

这是我的用例:

  • 我希望该delete函数final不能在接口的实现中被覆盖。
  • 我希望 在接口的实现中重写validateCanDelete和方法。deleteNewsItem

现在,我知道目前这是不可能的,并且在接口中不允许将 Final 添加到方法中。我也知道我可以通过用抽象类替换接口来实现这一点。

但是,我想知道是否有一种方法可以在接口中实现相同的功能,因为我的final方法不会有任何“状态管理”逻辑。

Fra*_*ung 7

虽然接口中不可能有最终方法,但为接口类型定义扩展方法是绝对可以的。

interface NewsItemState {
    fun validateCanDelete(newsItem: NewsItem)
    fun deleteNewsItem(newsItem: NewsItem)
}

fun NewsItemState.delete(newsItem: NewsItem) {
    validateCanDelete(newsItem)
    deleteNewsItem(newsItem)
}
Run Code Online (Sandbox Code Playgroud)

  • @DimitarSpasovski 从技术上讲,您无法重写扩展方法,因为这些方法是静态分派的。您可以在子类中实现具有相同签名的方法;然后,只要编译器知道它引用的是子类,它就会调用该方法而不是扩展。(并且_that_方法可以在子子类中被重写。)但是在超类上调用它总是会给你扩展名,所以它不是完全重写。 (7认同)