9
votes

Java Cast Interface en classe

J'ai une question sur l'interface et la classe d'implémentation d'interface.

Ceci est mon code: P>

((cMyClass)i).iMethod2();


0 commentaires

3 Réponses :


15
votes

Oui, cela fonctionnera (si vous modifiez la déclaration de cmyclass pour implémenter imyInterface ) et c'est sûr tant que la référence est vraiment Reportez-vous à une instance de cmyclass .

Cependant, c'est une idée généralement mauvaise. L'ensemble de l'utilisation d'une interface est de pouvoir fonctionner avec toute mise en œuvre - il doit séparer l'abstraction de la mise en œuvre. Si vous voulez alors avoir besoin d'une implémentation spécifique, vous pouvez aussi bien faire le type de i juste cmyclass pour commencer par.

Supposons que vous appelle vous-même le constructeur CMYClass CMLYCLASS, vous recevez un paramètre de méthode de type imyInterface - c'est une mauvaise idée de se lancer vers CMYClass À ce stade, comme cela pourrait être un Différent implémentation de l'interface.

(sur une note distincte, il est judicieux de commencer à suivre les conventions de nommage Java, qui indiquent que les classes et les interfaces devraient être pascalées - dediter le C et i Préfixes.)


3 commentaires

Je pense que, s'il va se lancer, il devrait vérifier la distribution avec instance de , pour être du bon côté de la sécurité.


@ S.L.Barth: Sauf si le mode de défaillance souhaité est une parfaiteCastException de toute façon, bien sûr, auquel cas une fonte inconditionnelle va bien.


@Jon Skeet merci, je l'utilise maintenant, y compris la méthode2 dans l'interface. Désolé j'ai oublié d'ajouter implémente imyinterface dans mon échantillon.



0
votes

Il fonctionnera (à condition que CMLYClass implémente imyinterface et que vous êtes dans la portée du modificateur protégé), mais ce n'est pas le bon approche OO.

Si vous souhaitez utiliser Iméthod2 considérer:

  • l'ajouter à l'interface
  • Créer une autre interface contenant cette méthode
  • Utilisez cmyclass myClass = nouveau cmyclass ();

1 commentaires

Merci, j'ajoute la méthode2 dans mon interface.



0
votes

Il y a une autre alternative à l'interface de distribution à une classe. Voici l'exemple comment.

public class Main {
public static void main(String[] args) {

    cMyClass myClass = new cMyClass();
    myClass.getMyInterface().iMethod1();
    myClass.iMethod2();
}
}


0 commentaires