如何在 kotlin 类 中重用私有函数?

How can I reuse private functions in kotlin classes?

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

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)
            }
        }
    }
}

我不能使用继承重用这个函数,因为这些 类 已经有 super类。我不能使用接口,因为这些函数需要 public。我如何重用此代码?

要在这些 class 派生自同一个父代的实体之间重用这个私有函数,同时保持私有,您可以使用以下技巧:

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

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