Dans le code suivant, je voudrais définir une référence à l'instance de classe afin que les fonctions statiques puissent renvoyer une référence à celle-ci: mais réglage instance code> n'est pas autorisé. Comment puis-je retourner une instance de la classe d'une fonction tout en gardant la classe comme singleton? P> p>
3 Réponses :
Cela semble fonctionner. Au lieu de garder une variable qui détient une référence à la classe, il suffit de référencer le nom de la classe suffit. Toutefois, pour renvoyer une instance de la classe des fonctions, le type de retour doit être compagnon: Ce n'est pas un vrai singleton, car vous pouvez toujours créer une nouvelle instance si vous l'avez fait: < / p> Toutefois, si vous ne créez jamais une instance mais que vous réservez uniquement les fonctions statiquement, il se comporte comme un singleton et l'état de toutes les variables privées à l'intérieur de l'objet compagnon sera toujours Maintenu. P> Mise à jour: strong> P> J'ai rencontré ce code sur le site de développeur Android qui montre un exemple de classe configuré comme un singleton: < / p> mais il convient de souligner que cet exemple nécessite des fonctions qui doivent renvoyer une instance à la première vérification si la variable d'instance est définie et si non, créez une nouvelle instance. Je ne suis pas sûr de ce que le point de cela est depuis pour appeler la fonction que vous avez déjà une instance. Alors pourquoi déranger créer une nouvelle instance? Ne semble pas avoir de sens. P> p>
Dans votre exemple supérieur, vous ne pouvez pas hériter des fonctions de l'objet compagnon si vous sous-classe TestRunner. Les objets compagnons ne font pas partie de la définition de la classe extérieure. Ce ne sont que des singletons qui peuvent être désignés de manière commodité par le nom de cette classe extérieure.
Si je vous ai raison, vous voulez quelque chose comme ceci:
abstract class TestRunner {
companion object : TestRunner()
}
Nan. Les classes abstraites n'ont pas de mise en œuvre. Je voulais juste retourner une référence à l'instance de classe dans les fonctions. Voir ma solution ci-dessous.
Pour que votre classe soit sous-classable, vous ne pouvez pas définir les fonctions de l'objet compagnon. Mais vous pouvez faire le résumé de la classe afin qu'il ne puisse être instancié que si sous-classée. Ensuite, rendez votre objet compagnon étendre la classe abstraite afin que toutes ces fonctions soient disponibles. P> utilisation: p> Notez que votre singleton n'est pas une instance de Testrunner. C'est une instance singleton d'une sous-classe de Testrunner. Mais puisque vous ne définissez aucune fonction supplémentaire et ne remplace rien, il se comporte exactement comme un testtrunner. P> Si vous voulez une sous-classe: P> objet code> à Kotlin est le singleton, pas la classe est définie dans l'intérieur. Un objet compagnon a la commodité supplémentaire de vous permettre de l'appeler par le nom de cette classe extérieure. Mais cela n'atteigne autrement aucune hiérarchie avec elle. abstract class ExtendedTestRunner: TestRunner() {
fun someOtherFunction() {}
companion object: ExtendedTestRunner()
}
Supprimez le bloc Init de l'objet compagnon. Dans ce bloc,
ceci code> est l'objet compagnon, qui n'est pas un testRunner, mais un testtrunner.chanion (comme le message d'erreur indique)Désolé, j'ai collé ce code sans le retirer d'abord. Je l'avais en fait supprimé. J'ai corrigé le code ci-dessus, mais la question reste la même.
Ce code compile une amende (à l'exception des variables et des classes non définis). Que faites-vous, que vous attendez-vous à arriver, que se passe-t-il à la place? Être précis. Inclure tout message d'erreur complet et exact que vous obtenez.
Dans la fonction AddTestSetUps, il renvoie Testrunner. Je fais cela pour permettre le chaînage des fonctions. Mais pour enchaîner le travail, j'ai besoin d'une référence à l'instance de classe. La variable "instance" doit donc être définie.
Instance de réglage = Ceci est B> autorisé. Alors, quelle est votre question? Poster le code concerné. Dis ce que tu fais, que pensez-vous arriver, que se passe-t-il à la place? Être précis. Inclure tout message d'erreur complet et exact que vous obtenez.
Oui, instance de réglage = Ceci est autorisé, sauf init ne sera jamais appelé.
Il sera appelé si vous appelez le constructeur de Testrunner ou de l'une de ses sous-classes. Qu'essayez-vous d'atteindre? Si vous souhaitez créer un singleton, tout ce dont vous avez besoin est
objet testtrunner {...} code>. Votre classe n'est actuellement pas un singleton, car vous pouvez créer autant d'instances de celui-ci, ou de toute sous-classe, comme vous le souhaitez.J'ai besoin d'un singleton qui peut être hérité de. D'où "Testrunner de classe ouverte". Vous ne pouvez pas utiliser avec juste un objet. Vous avez raison de ne pas être un singleton, mais c'est le plus proche que je puisse obtenir tout en permettant aux fonctions d'être statique.