2010-12-08 5 views
0

J'ai une classe de base "Shapes" et une classe étendue "Circle". Les deux ont une méthode getName. Ma classe de test est la classe "Driver".Problème de résolution de portée ascendante Java

Je transmets un objet Cercle à Formes et le passe à une fonction appelée polyTest. Dans cette fonction, je veux appeler getName mais je ne veux pas que l'implémentation des objets circle de get name soit déclenchée mais que l'implémentation des classes de base soit déclenchée.

super.getName() ne fonctionne pas.

Mon code est ci-dessous.

public class Driver{ 
    public static String polyTest (Shapes s){ 
     return s.getName(); 
     /*Instead of s.getName()... (gives me the Circle class implementation of getName()) 
     I want to call s.Shapes::GetName, the base class implementation of getName. */ 
    } 

    public static void main(String[] args){ 
     Circle c = new Circle(); 

     //Test Basic inheritance & basic polymorphism. 
     //System.out.print(c.getName()); 

     //Upcast test. 
     Shapes s = (Shapes) c; 
     System.out.print(polyTest(s));  
    } 
} 

public class Circle extends Shapes{ 
    Circle(){ 
     super(); 
    } 

    public String getName(){ 
     return "I am a Circle"; 
    } 
} 

public abstract class Shapes{ 
    Shapes(){ 
    } 

    public String getName(){ 
     return "I am a Shape"; 
    } 
} 
+1

On dirait que quelque chose ne va pas dans la conception. BTW, vous n'avez pas besoin d'upcast à «Formes». Qu'est-ce que tu veux faire? – khachik

Répondre

5

C'est exactement comme ça que fonctionne le polymorphisme Java, j'en ai peur. Vous ne pouvez pas forcer un appel de méthode virtuelle à être exécuté de manière non-virtuelle, en dehors de la méthode elle-même (où vous pouvez appeler super.getName()). La possibilité de le faire casserait l'encapsulation - par exemple, une classe peut valider ses arguments d'une manière particulière dans une méthode surchargée avant d'appeler la super méthode ... si vous pouviez contourner cela et dire "Je veux seulement appeler l'original mise en œuvre "alors vous viole le but de surcharger la méthode en premier lieu.

Vous devez redéfinir votre code afin que vous ne pas besoin d'appeler une implémentation particulière. Le point de polymorphisme est de permettre aux sous-classes de spécialiser le comportement sans que l'appelant sache à l'avance quelle est cette implémentation.

Bien sûr, si vous voulez qu'une méthode soit non remplaçable, vous pouvez la rendre finale.

+0

[Citation] Si vous pouviez contourner cela et dire "Je veux seulement appeler l'implémentation d'origine", alors vous violeriez le but de l'annulation de la méthode en premier lieu. [/ Quote] Je ne veux pas seulement Pour utiliser l'implémentation de base, je voulais juste savoir si je devais remplacer getName si je perdais l'accès à l'implémentation d'origine. En C++, ce n'est pas parce que je surcharge que je perds l'accès à l'implémentation dont j'ai hérité. Je vois que j'ai accès à l'implémentation orig dans le fichier Circle src mais pas en dehors de celui-ci ... Il semble que l'on soit bloqué avec impliden overriden. en Java. THX. – user440297

+0

Désolé, j'ai manqué de caractères dans ma réponse. Alors, est-ce vraiment le cas en Java? Si vous remplacez vous êtes bloqué avec l'implémentation substituée? – user440297

+0

@ user440297: Oui. C'est comme ça que le polymorphisme fonctionne en Java. –

0
  1. Vous n'avez pas besoin d'incrémenter Circle à Shapes. (BTW, pourquoi Shapes mais Circle?)
  2. Si vous ne voulez pas que votre classe Circle implémente sa propre méthode getName, ne la remplacez pas.
  3. Si vous devez surcharger la méthode getName pour quelque chose d'autre, vous pouvez ajouter getNameInSomeContext à votre classe Shapes et la remplacer si nécessaire dans les classes dérivées.
+0

1. Je sais que je n'ai pas besoin d'upcast, je l'ai fait pour voir si je peux axs ma mise en œuvre héritée. Le problème avec oop est que les créatures non omnipotentes écrivent le code ... voulait voir si j'avais perdu l'accès à l'implémentation de base ... juste au cas où je voudrais utiliser l'ancienne implémentation pour un besoin inattendu. – user440297