Question

J'ai deux classes A et B, où B est la sous-classe A et A n'est pas abstraite. Par conséquent, je peux avoir des objets qui sont par exemple des A et des objets qui sont par exemple de B (et donc de A).

Comment puis-je distinguer les objets qui sont par exemple seulement de A?

Bien sûr, je peux écrire quelque chose comme « objet instaceof A &&! (Instance d'objet B) » mais est une conception très pauvre car je vais devoir changer le code à chaque fois que j'ajouter de nouvelles sous-classes à A. De meilleures alternatives ?

Était-ce utile?

La solution

object.getClass() == A.class

Autres conseils

Pourquoi vous voulez qu'ils distinguer? Habituellement, cela est le contraire de OO. Vous avez des instances différentes que vous n'avez pas besoin de faire la distinction parce que la mise en œuvre différente fait tout droit.

Si vous avez besoin de le faire que il devrait y avoir un protocole pour elle. Avoir une méthode à cette fin qui renvoie quelque chose à reconnaître. Plus souple aussi.

Je instanceOf et getClass considèrent déjà mauvais style si cela est utilisé sans raison valable

Une meilleure approche est de faire le test le résultat d'une méthode

class A {
   public boolean isSomeTest() {
      return true;
   }
}
class B extends A {
   public boolean isSomeTest() {
      return false;
   }
}

Ensuite, si vous ajoutez un C qui extends A, vous pouvez lui permettre de revenir vrai ou faux.

Le nom de isSomeTest devrait préciser ce retour vrai ou faux devrait signifier.

Voici ce que je pense que vous dites:

public class A {
}

public class B extends A {
}

plus tard dans le code:

A apple = new A();
B banana = new B();

Voici quelques options qui pourraient vous être utiles:

if (apple.getClass() == A.class) { // Found an A }
if (banana.getClass() == A.class) { // This is not an A, won't get here. }
if (apple instanceof A) { // This is definitely an A }
if ((apple instanceof A) && (!(apple instanceof B))) { // It's an A but not a B }

En ce qui concerne la dernière option, vous écrivez ce qui suit:

  

Bien sûr, je peux écrire quelque chose comme   « Un objet instaceof &&! (Objet   instance de B) » mais cela est très   mauvaise conception que je vais devoir changer   le code à chaque fois que j'ajouter de nouveaux   A. alternatives à sous-classes mieux?

Polymorphisme presque nous aide toujours ici. Votre point de changer sur le code chaque fois que vous ajoutez une sous-classe est exactement le genre de symptôme que vous devriez reconnaître que l'évolution de la conception orientée objet standard. Pensez au comportement que vous essayez de produire. Pouvez-vous pousser que dans la classe elle-même plutôt que de déléguer à un prestataire extérieur dans la recherche qui doit en déduire quelle classe il travaille actuellement?

Sans plus d'informations, je ne peux pas donner des conseils trop, mais voici un exemple assez simple:

// Instead of this
if (apple.isClassA()) { // run class A code
} else if (apple.isClassB()) { // run class B code
// And so forth
}

Modifier la conception à devenir plus comme ceci:

public class A {
    public void executeCommand() { 
        // run class A code 
        // This method knows that it's definitely an A, not a B
    }
}

public class B extends A {
    public void executeCommand() { 
        // run class B code 
        // This method knows that it's a B (and, therefore, an A as well).
    }
}

Si plus tard dans le code d'exécution, vous remplacez votre précédente si le test avec:

apple.executeCommand();
banana.executeCommand();

Il est vrai que cela est une revue de conception orientée objet presque trivial, mais il peut secouer quelque chose lâche et vous aider avec votre problème de sous-classement.

ne pas montre que B est pas vraiment un A? Je ne suis pas tout à fait sûr que vous devriez obtenir dans cette situation? Peut-être que vous pourriez améliorer votre conception ??

Utilisez la méthode getClass d'un objet contre la propriété de classe:

if(someObject.getClass() == A.class){
   //some code
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top