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

Langage Java Discussion :

Problème classe derivée


Sujet :

Langage Java

  1. #1
    Membre confirmé Avatar de pseudobidon57
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Par défaut Problème classe derivée
    Bonjour, j'ai un probleme concernant l'utilisation de mes classes derivee..
    Voila mon probleme j'ai une classe abstraite Account et ses deux classes derivee que voici:

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
     
    abstract class Account {
     
    	public String name;
    	public int accountNumber;
    	private double balance;
     
    	public Account(int accountNumber, String name, double amount) {
    		this.accountNumber = accountNumber;
    		this.name = name;
    		this.balance = amount;
    	}
    }
     
    class CurrentAccount extends Account
    	{
     
    	private final String TYPE = "Current";
    	private double overdraft;
     
    	public CurrentAccount (int accountNumber, String name, double amount, double overdraft)
    		{
    		super(accountNumber, name, amount);
    		this.overdraft=overdraft;
     
    		}
    }
    class SavingAccount extends Account
    	{
     
    	private String rateInterest;
    	private final String TYPE = "Savings";
     
    	public SavingAccount (int accountNumber, String name, double amount, String rateInterest)
    	{
    		super(accountNumber, name, amount);
    		this.rateInterest=rateInterest;
    	}
    }
    je range mes objets de type Account dans une hashtable. Dans une autre classe qui implemente une interface, j'ai une methode qui doit retourner le type BankAccountOutputVO, en allant chercher les objets ranges dans ma hashtable
    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
     
     
    public final class BankAccountOutputVO
    {
    	private final String accountNumber;
    	private final String accountType;
    	private final String name;
    	private final String balance;
    	private final String overdraft;
    	private final boolean successfulTransaction;
     
    	public BankAccountOutputVO(String accountNumber, String accountType, String name, String overdraft, String balance, boolean successfulTransaction)
    	{
    		this.accountNumber = accountNumber;
    		this.accountType = accountType;
    		this.name = name;
    		this.overdraft = overdraft;
    		this.balance = balance;
    		this.successfulTransaction = successfulTransaction;
    	}
    Mon probleme est que dans ma table, l'objet est soit un de type CurrentAccount, soit SavingAccount, tout deux derives de Account, et donc je n'ai pas acces ou champs overdraft et rateInterest puisqu'il sont derives.. comment faire?? j'espere avoir ete assez clair .. merci..

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 30
    Par défaut
    Bonjour,

    Je crois qu'une méthode abstraite dans la classe account résoudrait ton problème.

    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
     
     
    abstract class Account {
     
    	public String name;
    	public int accountNumber;
    	private double balance;
     
    	public Account(int accountNumber, String name, double amount) {
    		this.accountNumber = accountNumber;
    		this.name = name;
    		this.balance = amount;
    	}
     
           abstract double getOverDraft();
    }
    Elle serait obligatoirement implémentée dans les sous classes et serait connue pour le type Account.

    J'espère que ça répond à ton problème.

  3. #3
    Membre Expert
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Par défaut
    Salut,

    Il y a peut-être mieux comme solution mais tu peux utiliser l'opérateur instanceof pour déterminer le vrai type de l'objet.

    ça donne un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if(monObjet instanceof CurrentAccount){
          monObjet=(CurrentAccount) monObjet;
          //code...
    }else{
          monObjet=(SavingAccount)monObjet;
          //code...
    }
    Voilà j'espère que c'est clair...

    @+


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 30
    Par défaut
    C'est pas tellement "Objet" le instanceof par contre .

    Ca fait pas très pro .

  5. #5
    Membre confirmé Avatar de pseudobidon57
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Par défaut
    Merci beaucoup pour vos reponses.. Je vais toute les essayer et les tester..
    Un collegue m'a suggerer une solution avec la methode toString de la classe objet, en l'utilisant dans mes classe derivee Mais je ne vois pas trop comment l'utiliser..
    j'imagine que ce serait un truc du genre:
    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
     
     
    class SavingAccount extends Account
    	{
     
    	private String rateInterest;
    	private final String TYPE = "Savings";
     
    	public SavingAccount (int accountNumber, String name, double amount, String rateInterest)
    	{
    		super(accountNumber, name, amount);
    		this.rateInterest=rateInterest;
    	}
     
    	public String toString()
    	{
    		return TYPE;
    	}
     
     
    }
    est ce que ce genre de solution peut marcher, et si oui, quelle est la meilleure de toute les solutions??

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 30
    Par défaut
    Je réittère la méthode abstraite , c'est la meilleure façon de s'en sortir dans ton cas, la plus propre et la plus "en phase" avec la programmation orienté objet !!

  7. #7
    Membre expérimenté Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Par défaut
    rhadamanthe +1 !

    Il faut utiliser une méthode abstraite qui et implémentée par les 2 classes concrètes. On utilise ainsi le polymorphisme de JAVA.
    De plus, l'introspection via le instanceof est plus coûteux en terme de performances, surtout que dans ce cas précis on peut s'en passer.

  8. #8
    Membre confirmé Avatar de pseudobidon57
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Par défaut
    Je suis en train d'experimenter vos solutions..mais j'ai l'erreur:
    java.lang.NullPointerException
    avec le code suivant:
    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
     
    public BankAccountOutputVO makeDeposit(String accountNumber, double amount)
    	{
    		Account thisAccount = (Account)accountStore.get(accountNumber);
    		thisAccount.setBalance(amount);
    		if (thisAccount instanceof CurrentAccount)
    		{
     
    			thisAccount=(CurrentAccount) thisAccount;
    			return new BankAccountOutputVO(accountNumber,"Current", thisAccount.getname(), Double.toString(thisAccount.getBalance()),"34", true);
     
    		}
    		else
    		{
    			return new BankAccountOutputVO(accountNumber, "Saving", thisAccount.name, Double.toString(thisAccount.getBalance()), "0", true );
    		}
    	}
    et pourtant, je suis certain que ma hashtable contient des valeurs.. d'ou cela peut il venir??

  9. #9
    Membre chevronné Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Par défaut
    Tu n'as pas dû instancier ta Hashtable par accountStore = new Hashtable().

    Idéalement, fais-le dans le constructeur de ta classe.

  10. #10
    Membre confirmé Avatar de pseudobidon57
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Par défaut
    si , je l'ai bien instancier, je ne comprend pas.., je met bien des objet a l'interieur mais je n'arrive pas les recuperer..:s

  11. #11
    Membre chevronné Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Par défaut
    Dis-moi à quelle ligne exactement a lieu cette exception (la ligne complète, hein, pas le numéro), le stacktrace de cette exception, ainsi que le code complet de la classe. Soit ta Hashtable est null (ce qui n'est pas le cas d'après ce que tu dis), soit ce sont les objets à l'intérieur qui sont null. Dans ce cas, c'est à l'insertion qu'il y a des objets que tu ne doit pas instancier.

  12. #12
    Membre confirmé Avatar de pseudobidon57
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Par défaut
    Merci bp rayndell, j'ai trouver la solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Account thisAccount = (Account)accountStore.get(new Integer(accountNumber));
    j'oublie toujours que l'on ne peut pas stocker de primitif dans les collections, mais seulement des objets..

  13. #13
    Membre confirmé Avatar de pseudobidon57
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Par défaut
    Par contre la methode avec la classe abstraite fonctionne bien , mais pas celle de instanceof..
    je n'arrive pas dans ce cas a acceder au methode de currentAccount ou savingAccount.. on dirait que la conversion en objet derive ne fonctionne pas.. pourquoi ??

  14. #14
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    thisAccount=(CurrentAccount) thisAccount;
    ça ne sert à rien, car ta référence thisAccount ne change pas de "type" !
    Il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CurrentAccount currentAccount =(CurrentAccount) thisAccount;

  15. #15
    Membre confirmé Avatar de pseudobidon57
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Par défaut
    Merci Beaucoup a tous..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. classe deriver de CDialog Polymorph
    Par philippe V dans le forum MFC
    Réponses: 3
    Dernier message: 07/02/2008, 21h03
  2. Recuperer un objet panel ds une classe derivé d'une JFrame
    Par benthebest dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 26/12/2005, 01h57
  3. problème classes templates...
    Par youp_db dans le forum C++
    Réponses: 3
    Dernier message: 02/11/2005, 13h04
  4. problème classe et fonction
    Par zmatz dans le forum C++
    Réponses: 14
    Dernier message: 19/10/2005, 21h46
  5. [MFC]creer une classe derivé de CWinThread
    Par psyjess dans le forum MFC
    Réponses: 2
    Dernier message: 18/03/2005, 14h23

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