【问题标题】:How can I reuse private functions in kotlin classes?如何在 kotlin 类中重用私有函数?
【发布时间】:2021-02-18 07:27:56
【问题描述】:

我有这两个包含相同功能的类。

class UpInfoDayFragment : UpDayFragment<FragmentNavSituationDayBinding>() {
    ...
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        setupViews()
        setupWhenItemDeletedFunctionality()
    }

    private fun setupWhenItemDeletedFunctionality() {
        viewModel.itemDeleted.observe(viewLifecycleOwner) { dayDeleted ->
            if (dayDeleted) {
                navigateToPreviousFragment()
                showMessage(binding.root, R.string.day_deleted)
            }
        }
    }
}
class UpInfoTopicFragment : UpTopicFragment<FragmentNavIdeasTopicBinding>() {
    ...
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        setupViews()
        setupWhenItemDeletedFunctionality()
    }

    private fun setupWhenItemDeletedFunctionality() {
        viewModel.itemDeleted.observe(viewLifecycleOwner) { topicDeleted ->
            if (topicDeleted){
                navigateToPreviousFragment()
                showMessage(binding.root, R.string.notebook_deleted)
            }
        }
    }
}

我不能通过继承重用这个函数,因为这些类已经有超类。我不能使用接口,因为这些功能需要公开。我怎样才能重用这段代码?

【问题讨论】:

  • 功能不一样,一个是删除day,另一个是topic。你可能会争辩说这可以归结为sameFunction(observable: LiveData, message: Int),但你为什么要抽象出两个不同的东西来使函数相同呢?
  • 它们并不完全相同,但有些代码可以重复使用

标签: android kotlin inheritance interface reusability


【解决方案1】:

要在这些类之间重用这个从同一个父类派生的私有函数,同时保持它是私有的,您可以使用以下技巧:

  1. 新建一个接口,并在该接口内为父类定义公共扩展函数:
interface UpInfoDayFragmentExtended {
    fun <T> UpInfoDayFragment<T>.setupWhenItemDeletedFunctionality() {
        //...
    }
}
  1. UpInfoDayFragment & UpInfoTopicFragment 实现这个接口。

瞧!现在setupWhenItemDeletedFunctionality() 函数可以从这些类中访问(实际上是任何其他将实现此接口的),但对其他人来说是隐藏的,就像私有方法一样!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 2016-01-25
    • 2019-09-13
    相关资源
    最近更新 更多