IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Possibilité d'assigner l'objet courant?


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2
    Par défaut Possibilité d'assigner l'objet courant?
    Bonjour, je débute en Java et j'aimerais savoir s'il est possible de réassigner l'objet qu'une méthode utilise. Je m'explique:

    Dans le cadre de mes études, j'essaye de réaliser un logiciel permettant des calculs matriciels simple avec de très grandes matrices. Je pars d'une classe Matrice abstraite qui comporte, entre autres, une méthode abstraite Set (qui prend en attribut deux entiers, i et j, ainsi qu'un double d et change le coefficient (i,j) en le remplaçant par d).

    Mon problème provient du fait que certaines classes héritant de Matrice stockent leur composantes différemment. Par exemple, pour une matrice diagonale je les stocke sous la forme d'un tableau (double M []). Je garde ainsi uniquement les coefficients diagonaux, les autres étant systématiquement nuls.

    Seulement voila, vu la structure de l'implémentation de ma matrice diagonale il m'est impossible de changer un coefficient qui n'est pas sur la diagonale!

    l'idée qu'il m'est venu est la suivante, mais elle n'a pas fonctionné:

    public void Set(int i, int j, double d){
    if(i==j){
    this.M [i-1]=d;//pas de problème ici
    }
    else{
    Matrice A = new Matrice_Normale(this.nblignes,this.nbcolonnes);//créé une matrice classique sous forme d'un tableau à 2 dimensions (double M_N [] [])
    this.Copy(A);//fonction recopiant les coefficients de la matrice courante dans A
    this = A;//c'est cette opération que je n'ai pas réussi à réaliser
    }



    }


    Merci d'avance pour votre aide

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Non, on ne peut pas assigner this.

    Une solution serait de faire en sorte que ta méthode set() renvoie une matrice contenant la modification demandée, en précisant qu'elle a le droit, mais n'est pas obligée, de modifier la matrice sur laquelle elle a été appelée.

    ça ressemblerait à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /**
     * Fournit une Matrice égale à cette Matrice, à part son élément (i, j), qui
     * lui aura la valeur indiquée.
     * En fonction de l'implémentation, cette méthode peut et peut
     * ne pas modifier la Matrice sur laquelle elle est appelée pour être égale à
     * la Matrice renvoyée.
     * En fonction de l'implémentation, cette méthode peut et peut ne pas
     * renvoyer l'instance sur laquelle elle a été appelée.
     */
    public abstract Matrice changeCoefficient(int i, int j, double coefficient);
    Du coup, quand ça t'arrange, tu modifies la matrice en cours et tu renvoies this. Quand c'est impossible, tu construis une nouvelle Matrice et tu la renvoies.
    Et les appelants ne comptent ni sur l'un, ni sur l'autre.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2
    Par défaut
    D'accord, c'est bien ce que je pensais avoir compris :/
    Le problème c'est qu'en créant une méthode Set qui renvoie une matrice je ne peux plus faire:
    M.Set(i,j,d);
    Je suis obligé de faire M = M.Set(i,j,d); pour que la modification soit prise en compte

    Est-ce que ça pourrait marcher si je surdéfinis Set par une methode static?
    Ca donnerais un truc comme ca:


    public void Set(int i, int j, double d){
    if(i==j){
    this.M [i-1]=d;//pas de problème ici
    }
    else{
    Matrice_Diago.Set(this,i,j,d); // appel de la fonction statique
    }
    }

    public static Set(Matrice M, i,j,d){

    Matrice A = new Matrice_Normale(M.Taille_i(),M.Taille_j());
    M.Copy(A);
    A.Set(i,j,d);
    M = A;



    }

  4. #4
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Sinon tu passes par de la délégation, ce qui évite d'exposer les particularités d'implémentation de la méthode set
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public abstract class Matrice {
     
       public abstract void set(int i, int j, double d);
    }
     
    public class MatriceNormale extends Matrice {
     
       public void set(int i, int j, double d) {
          ...
       }
    }
     
    public class MatriceDiagonale extends Matrice {
     
       private Matrice delegate = new MatriceDiagonale(...);
     
       public void set(int i, int j, double d) {
          if (i == j) {
             delegate.M[i -1] = d;//pas de problème ici
          } else {
             Matrice m = new MatriceNormale(delegate.M.Taille_i(), delegate.M.Taille_j());
             delegate.copy(m);
             delegate = m;
             delegate.set(i, j, d);
          }
       }
    }

Discussions similaires

  1. Assignation d'objet
    Par eilijah dans le forum Langage
    Réponses: 3
    Dernier message: 22/08/2008, 14h22
  2. [POO] Assignation d'objet en php5
    Par jeff_! dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2006, 17h22
  3. Objet Courant This et appel à un opérateur
    Par TheOyoStyledMan dans le forum C++
    Réponses: 2
    Dernier message: 13/06/2006, 16h35
  4. méthode sur l'objet courant?
    Par mathher dans le forum C++
    Réponses: 3
    Dernier message: 31/03/2006, 17h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo