2013-10-15 4 views
1

Je ne suis pas sûr de savoir comment décrire ce modèle que je veux, mais je voudrais quelque chose comme ceci:Java motif abstrait champ

public abstract class Parent { 
    protected abstract boolean foo = false; //this doesn't compile 
} 

public class Child1 extends Parent { 
    protected boolean foo = true; 
} 

comment puis-je faire cela? Imaginez que j'ai 1 Parent classe, mais comme 20 classes Child. pour la grande majorité des enfants, le foo devrait être false. Cependant, Child1 (et quelques autres) est le bizarre avec foo = true;.

Quelle est la conception OO la plus appropriée et le code le plus efficace pour ce faire?

+2

Vous avez oublié un type, 'boolean'. En outre, seules les méthodes et les classes peuvent être abstraites. Aussi, faites cela dans le constructeur. –

+0

À quoi cela sert-il? Ne pouvez-vous pas l'initialiser à la bonne valeur lorsque vous créez la sous-classe? –

+0

@SotiriosDelimanolis oh, merci pour la prise. et oui, d'où je l'ai écrit dans les commentaires qu'il ne compile pas. bon appel sur la partie constructeur. –

Répondre

2

Vous pouvez le faire avec un constructeur ou deux:

public abstract class Parent { 
    protected boolean foo; 
    protected Parent() { 
     this(false); // initialize foo to default value 
    } 
    protected Parent(boolean fooValue) { 
     this.foo = fooValue; 
    } 
} 

public class Child1 extends Parent { 
    public Child1() { 
     super(true); 
    } 
} 

public class Child2 extends Parent { 
    // no explicit super(boolean) call in c'tor gives foo the default value 
} 
+0

En fait, j'aime vraiment ça - vous forcez la valeur initiale variable dans le constructeur de l'enfant. –

0

Si vous souhaitez prolonger la Parent classe en utilisant Child1 classe, vous devez taper:

public class Child1 extends Parent { 

} 

A propos du paramètre foo, vous ne pouvez pas définir ce abstract puisque n'est pas une fonction (qui est, seulement les fonctions peuvent être déclarées abstract). Vous pouvez cependant le remplacer dans les sous-classes.

public abstract class Parent { 
    protected boolean foo = false; 
} 

public class Child1 extends Parent { 
    @Override 
    protected boolean foo = true; 
} 
+0

Cela ne changera pas la variable 'Parent.foo'. Votre annotation sera rejetée par le compilateur. – OldCurmudgeon

+0

J'ai oublié le 'extends Parent'. Merci! –

2

En premier lieu, les variables d'instance ne peuvent pas être abstract, seules les méthodes peuvent.

Pour avoir un comportement prioritaire, vous avez besoin de méthodes. Je voudrais définir une méthode, par exemple, isFoo dans Parent qui est défini pour renvoyer false. Aucune sous-classe ne devrait le remplacer, à l'exception du "bizarre" (s), qui peut le remplacer pour retourner true.

Alternativement, vous pouvez avoir une sous-classe Parent appelée WeirdOne (ne doit pas nécessairement être ce nom). La seule chose à faire est de remplacer isFoo pour retourner true. Puis Child1 et toute autre classe "bizarre" sous-classe WeirdOne. De cette façon, c'est seulement écrasé dans un endroit.

0

Ne pas utiliser un champ alors. Regardez cette combinaison de classes:

public abstract class Vehicle { 
    public abstract boolean isAerial(); 
} 

public abstract Flyer extends Vehicle { 
    @Override 
    public final boolean isAerial() { 
     return true; 
    } 
} 
// Add Airplane, Helicopter, Dirigible, Rocket, etc. 

public abstract Terrestrial extends Vehicle { 
    @Override 
    public final boolean isAerial() { 
     return false; 
    } 
} 
// Add Car, Truck, Boat, Bicycle, etc. 
1

Je pense que vous devez faire comme ce

public abstract class Parent { 

    protected boolean check = false; 

} 

public class Child extends Parent 
{ 
    public void method() 
    { 
     this.check=true; 
    } 

} 

// Vous pouvez le mettre dans le constructeur aussi