Depuis quelques heures je suis un poils bloqué à cause d'abstract builders en cascade et d'héritage. Je m'explique :
J'ai une classe AnimalBuilder qui construit des animaux :
abstract class AnimalBuilder<K extends Animal, T extends AnimalBuilder<K, T>> {
private String name;
public T name(String name) {
this.name = name;
return getThis();
}
protected String getName() {
return name;
}
protected abstract T getThis();
public abstract K build();
@Override
public String toString() {
return "Hi! My name is " + name + " and I'm a " + getClass().getSimpleName();
}
}
Ainsi qu'un sous builder Mammifère :
public abstract class MammalBuilder<T extends MammalBuilder<T>> extends AnimalBuilder{
protected boolean canStandUpright;
public T canStandUpright(boolean bool) {
this.canStandUpright = bool;
return (T) getThis();
}
}
Et au final le builder de l'animal en question :
public class CowBuilder extends MammalBuilder {
protected CowBuilder getThis() {
return this;
}
public Cow build() {
return new Cow(this);
}
}
Lors de la création je rencontre le problème suivant :
Animal animal = new CowBuilder().
je vois bien les méthodes name et canstandUpright, mais la méthode name renvois un AnimalBuilder et par conséquent le chainage se fini puisque c'est une classe abstraite. Y a t - il un moyen de continuer le chainage sans réécrire la méthode name dans la classe abstraite Mammal ?
Tu doit faire "remonter" le type CowBuilder et Cow jusqu'à la classe AnimalBuilder, sinon celle-ci ne connaît pas le type du builder.
abstract class AnimalBuilder<K extends Animal, T extends AnimalBuilder<K, T>>
public abstract class MammalBuilder<K extends Animal, T extends MammalBuilder<K, T>> extends AnimalBuilder<K, T>
public class CowBuilder extends MammalBuilder<Cow, CowBuilder>
Abstract Builder et héritage
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.