Partage
  • Partager sur Facebook
  • Partager sur Twitter

Porblème clonage d'objets

avec un attribut etant un array d'objets

Sujet résolu
    21 novembre 2010 à 19:15:41

    Bonjour je viens de commencer le java, et pour m'entrainer je veux faire une IA qui joue au morpion. :)
    Mais je cale sur un point: :euh:
    J'ai une classe "Board" que je veux cloner, elle est bien cloné sauf que celle-ci possède un tableau à 2 dimension d'objets "ElementBoard" qui eux, ne son pas cloné... :(

    Bon bah je vous passe le code (enfaite il y aussi 2 classe "MorpionSquareBoard" qui hérite de "SquareBord" qui hérite de "Board" et une classe "MorpionElementBoard" qui hérite de "ElementBoard"):
    Board
    package jmorpion;
    
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    /**
     *
     * @author root
     */
    public class Board implements Cloneable {
    
        protected ElementBoard[][] board;
        protected int weight;
        protected int height;
    
        public Board(int _weight, int _height) {
            board = (ElementBoard[][]) new ElementBoard[_weight][_height];
            weight = _weight;
            height = _height;
        }
    
        public ElementBoard get(int x, int y) {
            return board[x][y];
        }
    
        public void showBoard() {
            for (ElementBoard[] line : board) {
                for (ElementBoard element : line) {
                    System.out.print("  " + element.toString() + "  ");
                }
                System.out.println();
            }
            System.out.println();
        }
    
        protected void put(ElementBoard element, int x, int y) {
            board[x][y] = element;
        }
    
        protected void putAll(ElementBoard element) {
            for (int x = 0; x < weight; x++) {
                for (int y = 0; y < height; y++) {
                    put(element, x, y);
                }
            }
        }
    
        public int getHeight() {
            return height;
        }
    
        public int getWeight() {
            return weight;
        }
    
        public void setWeight(int weight) {
            this.weight = weight;
        }
    
        @Override
        public Board clone() {
            Board boardClone = null;
            try {
                boardClone = (Board) super.clone();
            } catch (CloneNotSupportedException ex) {
                Logger.getLogger(MorpionSquareBoard.class.getName()).log(Level.SEVERE, null, ex);
            }
            for (int x = 0; x < weight; x++) {
                for (int y = 0; y < height; y++) {
                    boardClone.board[x][y] = (ElementBoard) board[x][y].clone();
                }
            }
            return boardClone;
        }
    }
    
    SquareBoard
    package jmorpion;
    
    /**
     *
     * @author root
     */
    public class SquareBoard extends Board {
    
        public SquareBoard(int size) {
            super(size, size);
        }
    
        @Override
        public SquareBoard clone() {
            return (SquareBoard) super.clone();
        }
    }
    
    MorpionSquareBoard
    package jmorpion;
    
    import java.util.logging.Level;
    import java.util.logging.Logger;
    }
    /**
     *
     * @author root
     */
    public final class MorpionSquareBoard extends SquareBoard {
    
        public MorpionSquareBoard(int size) {
            super(size);
            try {
                putAll(new MorpionElementBoard(0));
            } catch (Exception ex) {
                Logger.getLogger(MorpionSquareBoard.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    
        @Override
        public MorpionSquareBoard clone() {
            return (MorpionSquareBoard) super.clone();
        }
    }
    
    ElementBoard
    package jmorpion;
    
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    /**
     *
     * @author root
     */
    public class ElementBoard<ElementObject> implements Cloneable {
    
        protected ElementObject element;
    
        public ElementBoard(ElementObject _element) {
            element = _element;
        }
    
        public ElementObject getValue() {
            return element;
        }
    
        @Override
        public String toString() {
            return element.toString();
        }
    
        @Override
        public ElementBoard clone() {
            ElementBoard elementBoard = null;
            try {
                elementBoard = (ElementBoard) super.clone();
            } catch (CloneNotSupportedException ex) {
                Logger.getLogger(MorpionSquareBoard.class.getName()).log(Level.SEVERE, null, ex);
            }
            return elementBoard;
        }
    }
    
    MorpionElementBoard
    package jmorpion;
    
    /**
     *
     * @author root
     */
    public class MorpionElementBoard extends ElementBoard<Integer> {
    
        public MorpionElementBoard(int value) throws Exception {
            super(value);
            if (value > 3 || value < 0) {
                throw new Exception("Valeur invalide: " + value);
            }
        }
    
        @Override
        public MorpionElementBoard clone() {
            return (MorpionElementBoard) super.clone();
        }
    }
    

    (j'espère que c'est pas trops gros :p )

    Pour tester tout ca je fait un:
    package jmorpion;
    
    /**
     *
     * @author root
     */
    public class Main {
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) throws Exception {
            MorpionSquareBoard morpionSquareBoard = new MorpionSquareBoard(3);
            MorpionSquareBoard newMorpionSquareBoard = morpionSquareBoard.clone();
    
            System.out.println("Plateau de l'objet avant le put() sur le nouvelle objet: ");
            morpionSquareBoard.showBoard();
            newMorpionSquareBoard.put(new MorpionElementBoard(1), 1, 1);
            System.out.println("Plateau de l'objet après le put() sur le nouvelle objet: ");
            morpionSquareBoard.showBoard();
    
            System.out.println("Weight du nouvelle objet avant le put sur l'ancien: " + newMorpionSquareBoard.getWeight());
            morpionSquareBoard.setWeight(100);
            System.out.println("Weight du nouvelle objet près le put sur l'ancien: " + newMorpionSquareBoard.getWeight());
    
        }
    }
    


    Et j'obtiens:

    Citation : NetBeans

    run:
    Plateau de l'ancien objet avant le put() sur le nouvelle objet:
    0 0 0
    0 0 0
    0 0 0

    Plateau de l'ancien objet après le put() sur le nouvelle objet:
    0 0 0
    0 1 0
    0 0 0

    Weight du nouvelle objet avant le put sur l'ancien: 3
    Weight du nouvelle objet après le put sur l'ancien: 3
    BUILD SUCCESSFUL (total time: 0 seconds)



    Logiquement le tableau ne devrais pas changer mais la ce n'est pas le cas et pourtant la variable weight (je l'ai pris au hazart) ne change pas !

    Je suis complètement perdu :( ca fait un bon moment que je cherche mais j'ai rien trouvé ...
    Merci d'avance pour ceux qui prendront la peine de lire tout le code ^^

    EDIT: Le problème a été resolu dans un autre forum !

    Citation : quelqu'un

    Lorsque tu fais
    Code :

    boardClone = (Board) super.clone();

    le clonage ne se fait pas en profondeur. Les attribut sont copié tels quels. Le clone et l'original partagent donc le même tableau

    Avant de cloner le contenu du tableau, il conviens de créer dans le clone un nouveau tableau, via un appel à
    Code :

    boardClone.board = new ElementBoard[width][height]

    pour avoir un nouveau tableau.

    • Partager sur Facebook
    • Partager sur Twitter
      21 novembre 2010 à 20:26:00

      Plop,

      Je ne sais pas si j'ai bien compris mais tu mets un élément à la position 1 - 1 de valeur 1 entre les deux appels, donc c'est normal qu'ils soient différents. Si tu veux que les deux soient identiques, tu clones ton objet après la modification. Un clone n'est pas un "pointeur" sur l'objet cloné, il prend simplement les mêmes valeurs.

      En espérant avoir pu t'aider
      • Partager sur Facebook
      • Partager sur Twitter

      Porblème clonage d'objets

      × 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