данных и открытой несовместимости, какая у меня альтернатива?

Я делаю kotlin порт gli, и я застрял сейчас

На самом деле у меня есть следующее

open class Texture

расширенный несколькими классами, такими как Texture2d

Теперь Texture обладает некоторыми свойствами

 protected val storage: StorageLinear? protected val target: Target protected val format: Format protected val baseLayer: Int protected val maxLayer: Int protected val baseFace: Int protected val maxFace: Int protected val baseLevel: Int protected val maxLevel: Int protected val swizzles: Swizzles 

поэтому я хотел бы иметь его как класс data , чтобы использовать equals() который поставляется вместе с ним.

но, к сожалению, data и open несовместимы .. (см. этот вопрос )

Один из способов я могу решить это, я мог бы написать свой собственный метод equals() , но это был бы шаблонный код и грязный, ровно две из самых больших причин, по которым я переключился на kotlin над java

Другой способ, поскольку все class расширяющие Texture , действительно ничего не добавляют, они действуют как строители (выглядит cpp Texture2d class ), будет ли это использование их как .. строителей (см. Этот отличный ответ от Кирилла)

Но поскольку ничего не приходит бесплатно, большой недостаток этого решения заключается в том, что я потеряю возможность иметь Texture2d в качестве класса, а Texture2d имеет хороший оператор [] для извлечения одиночных изображений текстур.

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

ИМХО самым практичным решением было бы создание equals в Texture и с этим делать.

Классы данных имеют очень узкое применение. Ваш пример действительно не соответствует классическому классу data , поэтому у вас есть эта проблема.

Использование интерфейсов и шаблона делегирования:

 interface Texture { fun method1() fun method2() } data class TextureImpl(val baseLayer: Int, val maxLayer: Int): Texture{ override fun method1() { } override fun method2() { } } data class Texture2d(val impl: TextureImpl) : Texture by impl data class Texture3d(val impl: TextureImpl) : Texture by impl 

Вы инициализируете конкретные классы, такие как TextureImpl с TextureImpl которые обычно являются абстрактными, но мы не можем сделать абстрактные данные класса.

Надеюсь, я не ошибаюсь, если скажу, что заменил наследство композицией здесь.

Это имеет смысл в вашем случае?

  • Могут ли функции расширения быть вызваны «статическим» способом?
  • Глобальная функция расширения в котлине
  • Как сделать локальный метод расширения доступным в функции с приемником?
  • Функция расширения Kotlin
  • Добавить функцию расширений в класс Math в kotlin
  • Неразрешенная ссылка функции расширения Котлина в сборке Gradle
  • Есть ли способ показать все функции расширения данного класса Kotlin в Intellij IDE?
  • Давайте будем гением компьютера.