2012-04-12 3 views
0

Je vais avoir un problème avec les constructeurs de classes et sous-classes (qui étendent la première classe)héritage et les méthodes

C'est le constructeur de la classe de base:

public Airplane(int x, int y, int width) 
    { 
     this.x = x; 
     this.y = y; 
     this.width = width; 
     createSeats(); 
    } 

Et est un autre ici le constructeur de la classe qui étend la classe de base

public Boeing(int x, int y, int width) 
{ 
    super(x,y,width); 
    createSeats(); 
} 

le problème est que createSeats() est une autre méthode dans les deux classes, mais Boeing doit passer outre t Le principal. Comment puis-je faire en sorte que cela fonctionne sans prendre la méthode createSeats()?

+0

Si vous avez créé une nouvelle méthode 'createSeats()' dans Boeing, elle remplacera celle de 'Airplane'. Qu'est-ce que vous essayez de faire? – kba

+0

Pourquoi cela ne fonctionnera-t-il pas comme vous l'avez fait? – jahroy

+0

N'appelle pas super (x, y, width) appel createSeats(); dans le constructeur aussi? – JA3N

Répondre

1

Si vous savez que vous voulez que tous les sous-classes de Airplane appeler createSeats() sur la construction, alors vous pouvez laisser l'appel dans le constructeur Airplane et retirer du Boeing.

Si vous souhaitez uniquement des sous-classes particulières, par ex. Boeing pour appeler createSeats() sur la construction alors vous pouvez laisser l'appel dans le constructeur Boeing et retirer de Airplane.

Vous ne pas besoin des invocations dans les deux constructeurs, les laissant se traduira par createSeats() être appelé deux fois pour chaque Boeing vous initialisez.

+0

Toutes les classes et sous-classes ont besoin de la méthode createSeats(), c'est que la méthode createSeats() dans Boeing remplace la méthode dans l'avion – JA3N

+0

Si c'est le cas alors le retirer du constructeur de la sous-classe. La méthode prioritaire sera invoquée dans le constricteur de la superclasse. – darrengorman

+0

@ JA3N C'est bien. Appeler 'Airplane.createSeats()' appellera 'Boeing.createSeats()' s'il a été remplacé par 'Boeing'. Donc l'effet sera le même. Voir ma réponse si vous voulez appeler 'Airplane.createSeats()' de la méthode surchargée. –

0

L'appel au super constructeur inclut déjà l'appel à la méthode createSeats(), donc vous n'avez pas à le réintroduire dans le constructeur Boeing.

Si vous souhaitez uniquement modifier le comportement de création de sièges, remplacez simplement cette méthode.

class Airplane { 
    public Airplane(int x, int y, int width) 
    { 
    this.x = x; 
    this.y = y; 
    this.width = width; 
    createSeats(); 
    } 

    void createSeats() { /* create them */ } 
} 
class Boeing { 
    public Boeing(int x, int y, int width) 
    { 
    super(x,y,width); // same steps as super class 
    } 

    @Override 
    void createSeats() 
    { 
    // do something else entirely 
    // possibly call super.createSeats() 
    } 
} 
-2

@Override

avant la méthode que vous souhaitez remplacer devrait faire le travail

+1

Cela fournit simplement une vérification à la compilation que la méthode annotée remplace une méthode de superclasse. Cela ne change en rien le comportement. – darrengorman

0

fréquemment une implémentation par défaut d'une méthode est fournie dans une super classe, ce qui vous permet de personnaliser le comportement une sous-classe en remplaçant la méthode dans une sous-classe. Par exemple. Est-ce qu'un avion sait comment créer des sièges sur un Boeing? Probablement pas, donc vous outrepassercreateSeats() dans votre sous-classe pour fournir l'implémentation spécifique qui fonctionne pour vous type particulier de Avion. Le fait que la méthode createSeats() soit appelée depuis le constructeur de votre super classe garantit que la méthode en question sera toujours appelée lors de la construction de l'objet. C'est un modèle de conception commun. C'est ce qu'on appelle la méthode de modèle. Fondamentalement, vous avez une méthode qui encapsule l'exécution d'un certain nombre de méthodes dans un certain ordre pour produire un résultat. Dans votre cas, il existe une méthode à savoir createSeats().

0

Je suis d'accord avec la réponse @ milkplusvellocet, mais vous avez également dit "Le problème est que createSeats() est une autre méthode dans les deux classes, mais Boeing doit remplacer le principal." Si vous avez besoin d'appeler la méthode d'une superclasse à la place de la votre, vous pouvez toujours appeler le super.createSeats().De cette façon, vous pouvez toujours différencier les méthodes de la superclasse et vos propres méthodes. Cependant, cela dit, cela est presque toujours utilisé dans la méthode que vous avez surchargée. Par exemple,

@Override 
public void createSeats() { 
    doSomethingSpecial(); 
    super.createSeats(); 
}