繁体   English   中英

如何覆盖伴随对象内的 kotlin 接口

[英]How to override kotlin interface inside companion object

我正在使用--library jvm-retrofit2coroutines=true使用open-api codegen生成代码。 我正在编写一个使用 REST API 的 Android kotlin 客户端库。 我不想只向我的库的用户提供原始的 Retrofit Response,所以我想像这样覆盖它:

open class ApiBook : RetrofitBooksApi {

    companion object {
        private fun getRetrofitService(): RetrofitBooksApi {
            val apiClient = ApiClient()
            return apiClient.createService(RetrofitBooksApi::class.java)
        }

        suspend fun getBooksList(...): MyCustomResponse<List<Book>> {
            return getBooksList(...)
        }
    }

    override suspend fun getBooksList(
        ...
    ): MyCustomResponse<List<Book>> {
        // Custom implementation, handling of errors, nulls, etc. and passing a
        // MyCustomResponse.Success or MyCustomResponse.Error object back.
    }   
}

MainActivity {
  ...
  val response = ApiBook.getBooksList()
  ...
}

这只是一个草稿,但正如你所看到的不仅仅是丑陋的。 问题是,如果我不从生成的 Retrofit 接口 (RetrofitBooksApi) 扩展类,当我有一天从 REST API 规范重新运行代码生成时,我不会看到接口中添加了新方法,所以我虽然可能我可以从接口扩展并覆盖它们,但现在我有一个问题,我需要调用伴随块内的覆盖函数,我不确定在每个函数中实例化类以便能够调用在外部覆盖函数,如果我可以让函数名称在内部和外部相同。 第二个问题是我无法真正将覆盖函数的返回类型更改为我的自定义响应对象,那么首先覆盖该函数是没有意义的,对吧?

如果我正确理解你的情况,那么你可以通过创建一个实现RetrofitBooksApi的单例来让它变得更简单:

object ApiBook : RetrofitBooksApi {
    override suspend fun getBooksList() { ... }
    private fun getRetrofitService(): RetrofitBooksApi { ... }
}

MainActivity {
  ...
  val response = ApiBook.getBooksList()
  ...
}

只要新的返回类型是原始类型的子类型,您就应该能够覆盖返回类型。 如果它不是子类型,那么您的ApiBookRetrofitBooksApi API 确实不同,我相信您需要手动保持它们同步。 另一种方法是编写一个编译器插件。 我不知道 Retrofit 是否对此类情况有任何帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM