kotlin接口中的最终方法

kotlin接口中的最终方法,kotlin,Kotlin,正如标题所述,我正在寻找一种在kotlin接口中实现final(无法重写的方法)的方法。 这是我的代码: interface NewsItemState { final fun delete(newsItem: NewsItem) { validateCanDelete(newsItem) deleteNewsItem(newsItem) } fun validateCanDelete(newsItem: NewsItem) f

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

interface NewsItemState {

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

    fun validateCanDelete(newsItem: NewsItem)
    fun deleteNewsItem(newsItem: NewsItem)
}
下面是我的用例:

  • 我希望
    delete
    函数是
    final
    ,这样它就不能 在接口的实现中重写
  • 我想要这个
    validateCanDelete
    deleteNewsItem
    中要重写的方法 接口的实现
现在,我知道这在目前是不可能的,并且在接口中不允许向方法添加final。我还知道,我可以通过用抽象类替换接口来实现这一点


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

虽然在接口中不可能有final方法,但为接口类型定义扩展方法是绝对正确的

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

fun NewsItemState.delete(newsItem: NewsItem) {
    validateCanDelete(newsItem)
    deleteNewsItem(newsItem)
}

你是用java实现的吗?或者更清楚地解释一下您的需求是什么?我的需求是在接口中定义一个方法/函数(不是抽象的),该方法/函数不能在该接口的任何实现中被重写。据我所知,我还没有在java中完成它,您也不能在java接口中定义最终方法。它不能在任何实现中被重写意味着它的用途是什么?它的用途是调用在实现中被重写的方法。这种方法会迫使人们做出某种行为。在我提供的示例中,它将首先调用
validateCanDelete
方法(在实现中重写)然后调用在实现中也被重写的
deleteNewsItem
方法。在这种情况下,
抽象类
似乎是一种解决方法。扩展方法可以在实现类中被重写,因此这不能满足我的第一个要求:“我希望delete函数是最终的,这样它就不能在接口的实现中被重写“@DimitarSpasovski从技术上讲,您不能重写扩展方法,因为它们是静态调度的。您可以在子类中实现具有相同签名的方法;然后,每当编译器知道它引用的是子类时,它就会调用该方法而不是扩展。(该方法可以在子类中重写。)但在超类上调用它总是会给您扩展,因此它不是完全重写。@DimitarSpasovski我很欣慰您认为它澄清了问题:-)