¿Por qué la class pública no puede extender la class privada?

Tengo una jerarquía de class siguiente:

interface Repository // This class contains some common stuff for LocalRepository and RemoteRepository. I'm never going to use this class outside this file, so I make it private private abstract class BasicRepositoryImpl // these classes are designed to be instantiated in other files class LocalRepository : BasicRepositoryImpl(), Repository // error class RemoteRepository : BasicRepositoryImpl(), Repository // error 

Pero me sale el siguiente error:

La visibilidad efectiva de la subclass 'público' debe ser la misma o less permisiva que su visibilidad efectiva de la superclass 'privada'

No quiero utilizar BasicRepositoryImpl ningún otro lado, por lo que se declara private , y quiero usar LocalRepository y LocalRepository en otros files como este:

 class Presenter(val repo: Repository) val p = Presenter(LocalRepository()) 

Pero ese error me impide crear esa jerarquía. ¿Por qué? ¿Qué pasa con eso?

La class y sus antepasados ​​deben ser accesibles desde la class de uso. De lo contrario, sería una infracción cargar la class ancestra, no solo llamar a sus methods o usar su funcionalidad. Kotlin es muy claro y claro acerca de esto en todos los casos donde la accesibilidad está presente.

Su apertura un poco permitiría cosas que podrían causar violaciones de acceso JVM reales más tarde, como una function en inline en la class pública, incorporada en otra class, llamando al acceso privado no accesible del antepasado. Hay muchos agujeros que no estás considerando si crees que está bien hacer un model mixto de accesibilidad como este. La matriz de consideraciones es mayor que solo el deseo de ocultar algunas classs de instanciación.

Dado que la class es abstracta, no se puede utilizar directamente como un antepasado, por lo que ya tienes cierta protección. Si desea bloquear el uso como un antecesor fuera de su module, haga que su constructor sea private o internal y eso resolverá ese problema:

 abstract class BasicRepositoryImpl private constructor() { ... } 

Ahora ha protegido la instanciación directa ( abstract ) o la usa como una class base (mediante el uso de constructores abstract y privados), por lo que lo último que debe hacer es darle un buen nombre, como AbstractBaseRepository y la gente, por convención, lo dejará en paz.

Si desea analizar "por qué" esta es la decisión de layout, o la limitación técnica, o la regla de protección … entonces pruebe los foros de discusión , una característica o una sugerencia de cambio de idioma en YouTrack . Pero ten cuidado, las cosas no son tan simples como parecen ser. Estas reglas están ahí por razones ( incluso si otros lenguajes lo permiten peligrosamente ).

solo hazlo class abstracta

Definición: una class abstracta es una class que se declara abstracta; puede include o no methods abstractos. Las classs abstractas no se pueden crear instancias, pero se pueden subclasificar.

  • Kotlin equivalente a Groovy spead-dot (*.)
  • En Kotlin, las references cíclicas de FasterXML / jackson, @JsonIdentityInfo y la exception UnresolvedForwardReference
  • Kotlin: For-loop debe tener un método de iterador, ¿es esto un error?
  • ¿Cómo establecer el atributo de peso de forma dinámica desde el código de Kotlin?
  • Leer valores de tipo de datos primitivos en Kotlin
  • Kotlin coroutines usa produce y mockito para burlarse del trabajo de producción
  • Swift - Salir de la function externa desde el cierre
  • FragmentStatePagerAdapter for Nested Pager (en fragment de la navigation inferior) está vacío
  • Observable.fromCallable () implementación con exception
  • no hay constructor pnetworkingeterminado para la entidad JPA con Kotlin, incluso con el complemento noarg
  • Kotlin nombró la syntax del parámetro para el cierre / lambda