2017-07-09 3 views
0

hérité Dire que j'ai cette structure pour mon code:Laisser les méthodes de superclasse être mises en œuvre par une classe

public abstract class A{ 
    public abstract Foo methodX(); 
    public abstract Bar methodY(); 
} 

public class B extends A { 
    public Foo methodX(){ 
     // stuff 
    } 
    public Bar methodY(){ 
     // more stuff 
    } 
} 

public class C extends A { 
    public Foo methodX() { 
     // stuff 
    } 
    public Bar methodY(){ 
     // What to do? 
    } 
} 

public class D extends C { 
    public Bar methodY() { 
     // do stuff 
    } 
} 

public class F extends C { 
    public Bar methodY() { 
     // do different stuff 
    } 
} 

La raison pour moi de faire cela parce que j'ai plusieurs class es étendant A, ont tous méthode commune methodX() et methodY() et j'ai plusieurs class es étendant B tous ont des propriétés communes à B, mais doivent avoir différentes façons de faire methodY() et ont différentes equals/hashcode.

alors, comment dois-je pour que 0.123.implémente le seul methodX() mais laisse C et D implémenter methodY() sans retourner null ou ne rien faire dans methodY() pour B?

+0

La classe «A» est-elle la seule qui soit abstraite? –

+0

oui, je dois pouvoir initialiser le reste des classes –

+0

Le point étant qu'une classe ne peut pas être instanciée sans savoir ce que toutes ses méthodes vont faire. Que cela soit fourni par une super méthode (non-abstraite), une classe anonyme, etc. – Rogue

Répondre

2

Vous devez déclarer la classe B comme abstraite

public abstract class B extends A{ 
    public Foo medhodX(){ 
     // stuff 
    } 
} 

En déclarant classe abstraite que vous lui permet pas de mettre en œuvre toutes les méthodes abstraites (de superclasse ou interface implémentée). Vous pouvez donc implémenter une seule méthode abstraite et forcer la classe enfant à implémenter toutes les méthodes abstraites restantes.

+0

Et si je dois aussi initier/créer une classe B? –

+0

Que voulez-vous que le comportement soit dans un tel cas? Puisque vous ne fournissez pas une implémentation de 'methodY()' – Valentin

+0

Vous ne pouvez pas instancier une classe abstraite car elle ne peut pas être entièrement fonctionnelle (elle ne sait pas quoi faire si quelqu'un invoque methodY). –