2017-04-18 4 views
-1

In liaison de méthode dynamique Une référence de super-classe peut uniquement appeler une méthode de sous-classe héritée et surchargée par celle-ci. Cependant, le contraire peut être mis en œuvre.Est-il possible qu'un objet de superclasse renvoie une méthode de membre de sous-classe qui n'est pas héritée?

abstract class in 
{ 
    abstract void print(); 
} 
class a extends in 
{ 
    String name=this.getClass().getSimpleName(); 
    void show() 
    { 
     System.out.println("class "+name); 
    } 
    void print() 
    { 
     show(); 
    } 
} 
class Main 
{ 
    public static void main(String args[]) 
    { 
     in x; 
     x = new a(); 
     x.print(); 
    } 
} 

Ici, il imprime avec succès

classe un

également getClass() renvoie le nom de sous-classe au lieu du nom superclasse ce fait référence à l'objet superclasse dans méthode principale.

+3

Les parents ne peuvent pas connaître les enfants. Un développeur d'une classe ne peut pas savoir comment sa classe sera étendue par les utilisateurs. – duffymo

+0

Tout 'in' sait qu'il devrait avoir une méthode appelée' print() '. Toute l'implémentation de cette méthode se déroule dans 'a', qui sait tout sur' a' (en ce qui concerne son nom de classe et d'autres méthodes). – khelwood

+0

Vous voulez dire que x.print() est équivalent à un nouveau(). Print()? Mais x n'est-il pas une référence de superclasse? – ZEU5

Répondre

0

Une référence d'objet parent est simplement contrainte par les méthodes dont elle dispose dans sa définition de classe. Si ces méthodes sont remplacées par une sous-classe et lors de l'exécution, si l'objet réel référencé par la référence parente est de type sous-classe, cette méthode substituée est invoquée. Peu importe si la méthode substituée appelle des méthodes qui ne sont pas présentes à l'origine dans la classe parente ou accède aux variables qui ne sont pas présentes dans la classe parente.

Voici ce qu'est le polymorphisme. Il est conçu de cette façon car il rend l'extension du programme plus facile si nous avons différentes hiérarchies d'héritage spécifiques où la classe parente n'a pas besoin de connaître l'implémentation exacte de certaines méthodes et peut rendre les choses implémentées par les sous-classes comme une sorte de contrat .

+0

Merci c'était la seule réponse utile. :-) – ZEU5

0

avenir est inconnu Un développeur écrire une classe aujourd'hui A.java ne peut jamais prédire l'avenir les noms ou les signatures des méthodes tout autre développeur peut inclure dans sa classe extension A.java. De telles classes peuvent également être nombreuses avec chacune des méthodes séparées.

La classe de base ne doit jamais être couplée à ses sous-classes. Il ne doit pas se soucier de la façon dont les sous-classes sont implémentées.

Bien que cela ne soit pas recommandé, mais si vous souhaitez invoquer la méthode définie dans l'une des sous-classe, vous pouvez le faire par typecasting comme ci-dessous.

public class Parent { 
    public class someMethod(){ 
      if(this instanceof Child1){ 
       ((Child1)this).someAdditionalMethod(); 
      } 
    } 
} 

public class Child1 extends Parent{ 
    public class someAdditionalMethod(){ 

    } 
}