4 votes

En Kotlin, comment déléguer à une interface et ne fournir qu'un constructeur public sans argument ?

Le problème vient du fait que Kotlin délégation de classe ne permet de déléguer qu'aux paramètres du constructeur, ce qui semble vous obliger à fournir un argument au constructeur.

Vous trouverez ci-dessous ma question initiale concernant un cas d'utilisation concret de ce problème.


Je souhaite procéder comme suit :

val myTable1: MyTable = MyTable()

  • MyTable hérite de ImmutableTable ( src ) ou au moins Tableau
  • et je n'ai pas besoin de déléguer manuellement tous les Table à une implémentation de base.

Je souhaite également éviter les situations suivantes :

val myTable2: MyTable = MyTable.build() 

Je ne veux pas être obligé d'utiliser des objets compagnons ou des méthodes d'usine statiques.

J'ai essayé d'étendre ImmutableTable mais je reçois This type has a constructor, and thus must be initialized here .

J'ai essayé d'étendre Table et lui déléguer (pour éviter de réimplémenter des méthodes), mais je suis alors obligé de fournir une instance de Table comme paramètre du constructeur. Je ne peux pas simplement l'initialiser dans init {} bloc.

Voir ce gist pour mes tentatives exactes.

Version de Kotlin utilisée : 1.0.2

6voto

Paul Blessing Points 2265

Comme indiqué dans les commentaires, la goyave a ForwardingTable qui peut accomplir cette tâche. Mais voici une autre option qui devrait fonctionner même pour les interfaces où il n'y a pas de version "forwarding" définie.

class MyTable private constructor(table: Table<Int, Int, Int>) : Table<Int, Int, Int> by table {

    constructor() : this(TreeBasedTable.create()) // or a different type of table if desired

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X