Intereting Posts
Что делает оператор стрелки («->») в Котлине? Ошибка: ошибка преобразования байт-кода в dex: причина: метод по умолчанию или статический интерфейс, используемый без –min-sdk-version> = 24 Как создать класс данных реализует специальные UserDetails Spring Secuirty Библиотека «Столкновение с пространством» вылетает со смертельным исходом 11 (SIGEGV) при вставке и удалении Альтернатива перегрузкам функций Программно раздутый макет с расширениями Android Kotlin Внедрение исключения Kotlin NullPointer java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: невозможно слить dex Вызов функций kotlin, которые являются ключевыми словами в java из java? Предварительный просмотр Anko DSL показывает только один вид Загрузка локальных файлов на Google Диск с помощью приложения Диска и без API Ошибка раздувания фрагмента класса android kotlin Какие пакеты / функции импортируются по умолчанию в Котлин? Что отсрочено в Anko coroutines kotlin? Компонент (не облачный) может не ссылаться на привязки с привязкой

Запечатанные внутренние классы

Я хотел бы создать закрытый класс классов, где каждый подкласс является внутренним классом некоторого внешнего класса. Я думал, что могу использовать закрытый внутренний класс для базы иерархии, например:

class Outer { fun foo(): Int { // ... } inner sealed class InnerBase(val i: Int) { fun sharedFunctionality() { println(foo() + i) } abstract fun doIt() inner class Inner1: InnerBase(1) { override fun doIt() { blah() sharedFunctionality() bloo() } } } } 

Обратите внимание, что

  • Outer – это класс, который может иметь много разных экземпляров. Каждый экземпляр должен иметь возможность создавать Inner1 , который будет вызывать правильный foo
  • Вселенность подклассов InnerBase конечна
  • InnerBase имеет некоторый метод экземпляра, который будет использоваться различными Inner подклассами, который обращается к InnerBase методу Outer foo
  • Конкретные подклассы InnerBase (например, Inner1 ) передают аргументы конструктору InnerBase

Однако проблема заключается в том, что я не знаю, как я могу построить значение типа Inner1 в Outer . Я надеялся, что это сработает:

 class Outer { // continued from above fun someMethod() { val x: InnerBase = InnerBase.Inner1() } } 

но это не с

 src/InnerSealed.kt:14:27: error: unresolved reference: Inner1 val x : InnerBase = InnerBase.Inner1() ^ 

Я думаю, проблема в том, что Inner1 на самом деле является внутренним классом Inner , поэтому мне нужен экземпляр Inner прежде чем я смогу построить экземпляр Inner1 . Однако это не то, что мне хотелось бы; Я хотел бы, чтобы Inner просто был базовым классом для моих классов Inner1 и т. Д., С некоторыми функциями, которые распределяются между всеми подклассами и которые получают доступ к данным экземпляра Outer .

Одно из решений, которое я нашел, – сделать InnerBase sealed :

 class Outer { fun foo(): Int { // ... } inner abstract class InnerBase(val i: Int) { fun sharedFunctionality() { println(foo() + i) } abstract fun doIt() } inner class Inner1: InnerBase(1) { override fun doIt() { sharedFunctionality() } } fun someMethod() { val x : InnerBase = Inner1() } } 

Но тогда подклассы InnerBase больше не закрываются.

Если я правильно понял вас, вам не нужны экземпляры Outer а не место для хранения « static » foo . Тогда вам нужен object s, а не class es.

Я заменил class Outer object Outer и удалил sealed :

 object Outer { var foo = 42 sealed class Inner(val i: Int) { init { println(foo + i) } class Inner1: Inner(1) } init { val x: Inner = Inner.Inner1() } } 

Технически то, что вы пытаетесь сделать, это:

 class Outer { var foo = 42 init { val x: InnerBase = InnerBase.Inner1(this) } sealed class InnerBase(val outer: Outer, val i: Int) { fun sharedFunctionality() { println(outer.foo + i) } abstract fun doIt() class Inner1(outer: Outer): InnerBase(outer, 1) { override fun doIt() { sharedFunctionality() } } } } 

Он предоставляет Inner1 экземпляр Outer без экземпляра Inner . Я не знаю, какой чистый способ сделать это в Котлине

Может быть, вам где-то не хватает статики? Поскольку вы не хотите, чтобы экземпляр класса использовал их внутреннее.

Конечно, я не так разбираюсь в Котлине, так что, возможно, я ошибаюсь.