Partage
  • Partager sur Facebook
  • Partager sur Twitter

Abstract Builder et héritage

    20 octobre 2016 à 17:03:31

    Bonjour à tous et à toutes !


    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 ?

    Merci encore !



    • Partager sur Facebook
    • Partager sur Twitter
      21 octobre 2016 à 0:46:08

      Salut,

      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>



      • Partager sur Facebook
      • Partager sur Twitter

      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.
      • Editeur
      • Markdown