0
votes

Comment concevoir une seule sous-classe doit être spécifiée à l'aide de polymorphisme?

Étant donné une classe de base base em>, c'est dit a em>, b em>, c em> étend base . S'il y a une méthode spécifique m () em> seulement dans c em>. Pour appeler m () em>, vous devez d'abord déterminer si la classe donnée est le type de C em>, une du chemin consiste à utiliser:

otherMethod(Base b){
  b.m();
}


5 commentaires

Si m () appartient à C et non à base , il devrait être dans C ; Tout comme get (int) appartient à la liste et non à collection . Vous pouvez toujours surcharge autremethod (base) avec autremethod (c c)


Quel est le cas d'utilisation? Faites-vous une itération sur une liste de et essayez d'appeler m () sur chacun d'eux, iff le type est C ?


@Markjeronimus C'est ce que je vais faire. La classe de base est une classe de forme et un b c est différent de formes. Et je veux boucler toutes les formes et faire quelque chose que si la forme est C.


@ernest_k Surcharge pourrait être une solution que je recherche. Je vais essayer de le concevoir avec une surcharge, merci!


Ouais un cas d'utilisation ici nous aiderait vraiment à comprendre ce que vous essayez d'accomplir


4 Réponses :


0
votes

Si une classe C a une méthode spécifique, la même chose ne doit pas faire partie de la classe de base . Pour appeler la méthode m () , vous devrez vérifier le type d'instance à l'aide d'une instance de l'opérateur , puis lancer votre la classe class sur C puis méthode d'appel m () comme ci-dessous xxx

plus loin, comme d'autres ont déjà cité l'exemple de collection et list , si votre classe C doit avoir une méthode spécifique, vous devez créer une interface , disons son appelé enfant qui devrait prolonger l'interface . Les 2 autres classes doivent mettre en œuvre une interface base . Et classe C doit mettre en œuvre une interface enfant

MAINTENANT, lorsque vous concevez BASE interface, définitivement, vous avez gagné ' t sais quelles méthodes spécifiques d'autres classes pourraient mettre en œuvre. Par conséquent, vous ne devez pas appeler une méthode spécifique dans votre méthod également.


2 commentaires

Il y a une erreur dans la compréhension des auteurs. L'auteur tente d'appeler la méthode à l'aide de l'objet de la classe de base. Bien que ce n'est pas une partie de celui-ci. Cela nécessite le casting de l'objet, sinon cela provoquera CLASSCASTEXCEPTION.Je ne disant que c'est la seule façon correcte. Comment suis-je me trompe ici?


@Manishbansal Désolé, j'étais tentant de donner un exemple rapide et je n'ai pas remarqué que c'est de ma faute. Mais ce que je cherche, c'est une réponse comme n'utilisant pas "l'instanceOf". Quoi qu'il en soit, merci!



0
votes

Une autre option consiste à utiliser des méthodes de dépassement. Lorsque vous appelez Autresmethod () sur un objet de base, il appellera les Dothings () définis dans la base, sauf si elle est une instance de C, qui a surchargé les dothings ().

public class Base {

   public void doThings() {
       // nothing happens
   }

   public void otherMethod() {
       doThings(); // will call method above if instance is Base object, will call method below if C object
   }
}

class C extends Base {

   public void doThings() {
       System.out.println( "Things actually get done" );
   }
}


1 commentaires

*****primordial



0
votes

Si vous avez Java 8 et que la performance n'est pas un problème (ce qui serait le cas si vous souhaitez rendant 10000 formes à 60fps), puis filtrez la collection.

supposant une collection COLLECTION Code>: P>

Collection<A> justA;
Collection<B> justB;
Collection<C> justC;


0 commentaires

0
votes

Ne pas infecter la conception plus loin que d'ajouter un base.visit (ivisitor v) {V.visit (this);} xxx

puis écrivez le Ivisiteur Vous avez besoin (ici avec l'instance de c) Bien sûr, vous pouvez simplement utiliser le consommateur au lieu de votre propre interface visiteur. Je voulais juste être clair.


0 commentaires