datos e incompatibilidad abierta, ¿qué alternativa tengo?

Estoy haciendo un puerto kotlin de gli y me atasqué ahora

En realidad tengo lo siguiente

open class Texture

extendido por varias classs como Texture2d

Ahora, Texture tiene bastantes properties

 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 

por lo tanto, me gustaría tenerlo como una class de data para explotar los equals() que viene con eso.

pero lamentablemente los data y los open son incompatibles … (ver esta pregunta )

Una forma en que puedo resolverlo, podría escribir mi propio método equals() , pero ese sería un código repetitivo y sucio, exactamente dos de las principales razones por las que cambié a kotlin en lugar de Java.

Otra forma, dado que todas las class extienden Texture realidad no agregan nada, actúan como constructores (se ve cpp Clase Texture2d ), sería el de usarlos como constructores (ver esta excelente respuesta de Kirill)

Pero como no hay nada gratis, una gran desventaja de esta solución es que perdería la posibilidad de tener Texture2d como class y Texture2d tiene un buen operador [] para recuperar imágenes individuales de texturas.

Dado que la comunidad de kotlin se ve extremadamente activa y queueboradora, me gustaría saber si tienes alguna idea mejor.

En mi humilde opinión, la solución más práctica sería generar equals en Texture y terminar con ella.

Las classs de datos tienen una aplicación muy limitada a propósito. Su ejemplo realmente no se ajusta a una class de data clásica, es por eso que tiene este problema.

Uso de interfaces y patrón de delegación:

 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 

Inicializas classs concretas como Texture2d con TextureImpl que normalmente serían abstractas pero no podemos hacer que la class de datos sea abstracta.

Espero que no me equivoque si digo que reemplacé una inheritance con una composition aquí.

¿Tiene sentido en tu caso?

  • Prueba JUnit con KOTLIN android studio
  • RecyclerView animation de elementos, se llama AnimationFinished, pero no está activado en AnimationStarted. ¿Por qué?
  • Tipos de unión / interfaces de extensión
  • En Kotlin, ¿cómo puedo instanciar una class genérica usando un parámetro nativo de Java?
  • DataBinding no se puede usar en BaseActivity donde codigo en Kotlin
  • Kotlin, proguard, Android Architecture Components
  • Vista previa de Android Studio 3.0 Faltan importaciones cuando se refabrica el código de Kotlin
  • Kotlin IllegalAccessError con + = y - = para la interfaz delegada
  • ¿Cómo puedo convertir CharArray / Array <Char> en una cadena?
  • Error de compilation de Kotlin cuando se usa Parcelable
  • Kotlin en Android: no se puede encontrar el manifiesto principal fusionado. Que esta causando este error?