Kotlin接口中的final方法

3

如标题所述,我正在寻找一种在Kotlin接口中实现不可重写方法(final method)的方法。

以下是我的代码:

interface NewsItemState {

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

    fun validateCanDelete(newsItem: NewsItem)
    fun deleteNewsItem(newsItem: NewsItem)
}

以下是我的使用情况:

  • 我希望delete函数被声明为final,以使其无法在接口的实现中被覆盖。
  • 我希望validateCanDeletedeleteNewsItem方法可以在接口的实现中被覆盖。

目前这种方法还不可行,并且在接口中添加final关键字是不允许的。我知道我可以通过将接口替换为抽象类来实现这一点。

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


你用Java实现了吗?还是能更清楚地解释一下你的需求? - sasikumar
我的要求是在一个接口中定义一个非抽象的方法/函数,该方法/函数不能在该接口的任何实现中被覆盖。 据我所知,我还没有在Java中完成这个操作,因为你不能在Java接口中定义一个final方法。 - Dimitar Spasovski
它的使用在于调用已经在实现中被覆盖的方法。该方法将强制执行某种行为。在我提供的示例中,首先会调用 validateCanDelete 方法(在实现中被覆盖),然后调用 deleteNewsItem 方法,该方法也在实现中被覆盖。 - Dimitar Spasovski
创建一个抽象类,实现接口并将方法标记为final - Taseer
是的,谢谢大家,看起来我要使用抽象类。 - Dimitar Spasovski
显示剩余2条评论
1个回答

7

虽然接口中不能有final方法,但为接口类型定义扩展方法是完全可以的。

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

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

1
扩展方法可以在实现类中被重写,因此这不满足我的第一个要求:“我希望删除函数是final的,这样它就不能在接口的实现中被重写”。 - Dimitar Spasovski
7
从技术上讲,你不能重写扩展方法,因为它们是静态分派的。但是你可以在子类中实现一个具有相同签名的方法;每当编译器知道它引用子类时,它将调用该方法而不是扩展方法。(并且在子子类中,该方法可以被重写。)但是在超类上调用它总是会给出扩展方法,因此这不是完全的重写。 - gidds
@DimitarSpasovski 我很欣慰你认为这澄清了问题 :-) - gidds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接