Comment puis-je passer le nom d'une classe à son constructeur de super classe et est-ce même possible? Je pense à quelque chose comme ceci:
class TestClass extends SuperTestRequiringName(this.getClass.getName) {}
3 Réponses :
class TestClass extends SuperTestRequiringName(classOf[TestClass].getName) In Scala classOf[A] is the same as A.class in Java.getClass is a method, which you only can call on instances of classes.
Merci, cela aide. Cependant, avoir accès au nom de la classe d'exécution réelle (il pourrait y avoir une autre sous-classe) serait encore meilleure. J'ai mis à jour la question à clarifier.
Je ne sais pas si je comprends bien votre question ou non, mais vous pouvez utiliser J'espère que cela aide! P> p> classtag code> à cet effet. Par exemple;
Merci, cela résout le problème de la cohérence lors du renommage. @ygor a posté une solution similaire. C'est un peu plus court. Dans ma compréhension, cela donne le même nom, n'est-ce pas? J'ai mis à jour ma question pour préciser en outre que je suis réellement intéressé par le nom de la classe d'exécution (sous-classe potentielle).
Je ne pense pas que votre problème ait une bonne solution tel quel. La façon dont le modèle de mémoire JVM fonctionne, vous ne pouvez pas utiliser ceci code> avant l'appel sur le constructeur de base, même pour obtenir votre propre nom de classe. Si la raison pour laquelle vous héritez de la classe de la bibliothèque consiste à réutiliser ses fonctionnalités, plutôt que de la nécessité d'utiliser vos classes dans les mêmes contextes, la classe de base est utilisée, je suggérerais de remplacer l'héritage avec Composition Quelle est la bonne solution pour un tel problème de toute façon. Le code irait comme suit:
Bien qu'il y ait de bonnes réponses à la question, la question elle-même est un signe que vous faites probablement quelque chose de mal. Tout d'abord, le code de la classe de base peut toujours obtenir le nom de la classe, tout en utilisant
ceci.getclass code>.
Ce code> ne ment jamais! Un autre problème est que si vous utilisez le nom de la sous-classe pour autre chose que la journalisation, vous faites probablement quelque chose de mal aussi mal. Si la bibliothèque demande au nom de la classe, elle demande peut-être un autre nom de classe? Pour résumer: Montrez-nous votre vrai problème et il pourrait y avoir une meilleure solution que cela.
@SERGGGR J'écris une classe de test abstraite censée réutiliser des objets lourds de poids, comme un système d'acteurs code> par sous-classe de béton et les éteignez uniquement dans le
après le crochet code> Utilisation du trait
OneInstancePertest code>, je vais donc créer un par cas de test autrement). Pour nommer le
actorsystem code> et avoir une référence unique pour chaque sous-classe, je pensais qu'il serait raisonnable de simplement utiliser le nom de la classe. Depuis que je hérite d'une autre classe abstraite qui reçoit le système d'acteurs code> comme argument de constructeur, j'ai besoin de le créer juste là-bas.
J'ai mis à jour la question à affirmer explicitement que je suis intéressé par le nom de la classe d'exécution.