Генери c Стати c Константа - PullRequest
0 голосов
/ 07 апреля 2020

Это сложно объяснить, но я в основном хочу иметь интерфейс, который должен реализовывать мой подкласс, который требует постоянной c. Как бы я достиг этого в Kotlin?

У меня есть следующий класс / интерфейс:

interface BaseFragmentInterface {
  val TAG: String
}

class BaseFragment: Fragment() {
  /* this, of course, doesn't compile right now: */
  companion object: BaseFragmentInterface {}

  func<T: BaseFragment> push(fragment: T) {
    /* Here I want to access TAG */
    Log.d(T.TAG, "Push Fragment")
  }
}

Для реализации интерфейса необходимы мои подклассы. И мой базовый объект-компаньон должен быть как-то abstract.

Есть идеи, как этого добиться?

1 Ответ

3 голосов
/ 07 апреля 2020

Позвольте мне уточнить несколько вещей.

Для реализации интерфейса необходимы мои подклассы.

Нет способа добиться этого, вы не можете заставить подкласс 'companion object для реализации вашего интерфейса, поскольку companion object класса не связан с companion object его суперкласса.

И мой базовый сопутствующий объект должен быть как-то абстрактным .

Поскольку companion object является object, оно не может быть abstract, поскольку object также не может быть abstract.

Сказал, что , у вас есть два варианта для достижения желаемого поведения:

  1. Использование TAG в качестве нестатиального c конечного свойства внутри BaseFragment:
abstract class BaseFragment : Fragment() {
    protected abstract val TAG: String

    fun <T : BaseFragment> push(fragment: T) {
        /* Here I want to access TAG */
        Log.d(TAG, "Push Fragment")
    }
}

class FragmentImpl : BaseFragment() {
    override val TAG: String = "fragment-impl"
}
Используйте сопутствующие объекты для хранения тега, сделайте тип T из push() как reified и получите доступ к свойству TAG внутри объекта-компаньона T, используя отражение .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...