如何在 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 派生自同一个父代的实体之间重用这个私有函数,同时保持私有,您可以使用以下技巧:
- 创建一个新接口,并在该接口内为父class定义public扩展函数:
interface UpInfoDayFragmentExtended {
fun <T> UpInfoDayFragment<T>.setupWhenItemDeletedFunctionality() {
//...
}
}
- 让
UpInfoDayFragment
& UpInfoTopicFragment
实现这个接口。
瞧!现在 setupWhenItemDeletedFunctionality()
函数可以从这些 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 派生自同一个父代的实体之间重用这个私有函数,同时保持私有,您可以使用以下技巧:
- 创建一个新接口,并在该接口内为父class定义public扩展函数:
interface UpInfoDayFragmentExtended {
fun <T> UpInfoDayFragment<T>.setupWhenItemDeletedFunctionality() {
//...
}
}
- 让
UpInfoDayFragment
&UpInfoTopicFragment
实现这个接口。
瞧!现在 setupWhenItemDeletedFunctionality()
函数可以从这些 classes 内部访问(实际上任何其他将实现此接口的函数),但对其他人来说是隐藏的,就像私有方法一样!