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 :

[POO]MultiHeritage et Interface - Pb


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 12
    Par défaut [POO]MultiHeritage et Interface - Pb
    Voila mon problème exposé avec un exemple simple :

    Soit les classes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class Bmw extends Voiture{
     
    	public Bmw(){
    	super();
    	}
     
    	public void conduire(){
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class Voiture implements IVoiture
    {
    	public void Voiture(){
    	}
     
    	public void conduire(){
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public interface IVoiture{
     
    	public void conduire();
     
    }
    Mon main et le cast que j'aimerai réaliser, sachant que normalement les méthodes ne sont pas vides dans le programme que je developpe (et qui n'a rien a voir avec les voitures :p )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class Main
    {
        public static void main(String[] args)
        {
    	//MARCHE PAS
    	Bmw b=new Bmw();
    	Voiture voiture = (IVoiture) b;
        }
    }
    Bon ben voilà si vous avez une solution pour détourner ce problème en java ...
    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de viena
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    1 071
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 071
    Par défaut
    Il n'est pas très conventionnel d'implémenter conduire dans Voiture ET dans BMW. Peut être que ton problème vient de là.

  3. #3
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    Salut,

    Un constructeur n'a jamais de type de retour, pas même void.
    -->Constructeur de Voiture<--

    Autre chose, dans ta classe Main :
    mets plutôt ça

    mavina

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 109
    Par défaut
    Dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Voiture voiture = (IVoiture) b;
    la référence à droite du "=", c'est à dire (IVoiture) b, est du type IVoiture. Or un IVoiture n'est pas un Voiture (c'est le contraire). Donc tu ne peux pas faire l'affectation.


    Pour que ca marche, il faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IVoiture voiture = (IVoiture) b;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Voiture voiture = (Voiture) b;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IVoiture voiture = (Voiture) b;
    [edit] d'ailleurs les casts sont superflus[/edit]

  5. #5
    Membre expérimenté Avatar de @ldehan
    Profil pro
    Développeur Java
    Inscrit en
    Mars 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 215
    Par défaut
    tu ne peux pas mettre de reference Voiture sur un objet de type IVoiture.

    implementer une interface revient a hériter. IVoiture est situé au dessus de Voiture dans la hiérarchie.

    cela revient a faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Bmw bmw = new Voiture();
    par contre tu peux faire l'inverse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IVoiture voiture = (Voiture) b;
    le type du contenant ( la référence) doit toujours être au-dessus du contenu (l'objet effectif). Ceci en terme de hiérarchie.

    mais si tu veux vraiment une reference de type de Voiture, pourquoi ne pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Voiture voiture = (Voiture) b;
    qui est en fait un cast explicite pour ceci (revient au meme) :
    Si ceci ne repond pas a ta question, c'est qu'il doit y avoir un probleme de conception.

    [edit]grilled [/edit]

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 12
    Par défaut
    Merci pour toutes vos réponses, je vais prendre le temps de les lire plus en détails ce soir.

    Désolé pour les constructeurs avec paramètre de retour, je devrai avoir honte aprè autant d'heure passé le nez dans le code lol.

    Je vais vous exposer en fait le problème que j'ai.

    Un capteur possède n composants de différentes natures.
    L'architecture mise en place dans le projet est la suivante :

    - Une classe générique Composant_Generique,
    - Des classes Composants dérivant de Composant_Generique,

    Problème; un de mes composants ( une pile de messages ) doit étendre de la classe TimerTask pour etre lancé a intervalle régulier ... ce qui me fait 1 classe ... et 2 extends ...

    Je me suis dit, que nenni ! faisont avec des interfaces ... un peu comme Runnable et Thread. Sauf que voilà, impossible d'y arriver.

    J'ai fait une interface IComposant_Generique reprenant les méthodes de composant. Ma classe pile dérive donc de TimerTask et implémente IComposant_Generique.

    Je tente donc de faire ... Composant_Generique composant_generique=(IComposant_Generique)ObjetClassePile

    Et là c'est le drame ... "Class Cast Exception" ... en meme temps je n'y croyai pas trop....

  7. #7
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    Salut,

    Problème; un de mes composants ( une pile de messages ) doit étendre de la classe TimerTask pour etre lancé a intervalle régulier ... ce qui me fait 1 classe ... et 2 extends
    passes par une classe générique 2 que je notterai Classe_Generique_Time par exemple, qui elle extends Timer ...
    l'héritage multiple en java n'est pas interdit, juste limité
    enfin, c'est ce que je comprends de ton sujet :o

    mavina

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 109
    Par défaut
    tu peux en général résoudre le problème par de la composition et avec des interfaces. p.ex.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class PileDeMessage exetnds TimerTask implements IComposantGenerique {
    private ComposantGenerique composantGenerique;
    ...
    public void methodeDeIComposantGenerique1() {
        //on délègue : équivalent de l'héritage
        composantGenerique.methodeDeIComposantGenerique1()
    }
    public void methodeDeIComposantGenerique2() {
       //ici on ne délègue pas : équivalent de la redéfiniiton
    }
    }
    Ainsi, PileDeMessage possède à la fois l'interface de TimerTask et IComposantGenerique.
    Elle possède le comportement de TimerTask par héritage et celui de ComposantGenerique par délégation.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 12
    Par défaut
    Yop, merci des reponses encore une fois !

    Citation Envoyé par mavina
    Salut,
    passes par une classe générique 2 que je notterai Classe_Generique_Time par exemple, qui elle extends Timer ...
    l'héritage multiple en java n'est pas interdit, juste limité
    enfin, c'est ce que je comprends de ton sujet :o
    mavina
    Seul problème avec cette méthode, je ne peut plus faire :

    Composant_Generique composant_generique=(Composant_Generique)ObjetClassePile

    Je vais voir pour la solution de "MangeurVasqué", meme si je n'est pas trop compris pourquoi il delegue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void methodeDeIComposantGenerique2() {
       //ici on ne délègue pas : équivalent de la surcharge
    }
    [

Discussions similaires

  1. POO: syntaxe heritage + interface
    Par masbaye_noubadoum dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2010, 13h21
  2. [POO] réaliser une 'interface' avec PHP4
    Par TabrisLeFol dans le forum Langage
    Réponses: 3
    Dernier message: 27/12/2008, 21h00
  3. [POO] héritage et interface
    Par stailer dans le forum Langage
    Réponses: 1
    Dernier message: 17/04/2007, 13h14
  4. [POO] Différence entre Interface et classe Abstraite
    Par viviboss dans le forum Langage
    Réponses: 7
    Dernier message: 29/11/2006, 16h39
  5. [Language][POO]classe interface
    Par Samanta dans le forum Langage
    Réponses: 9
    Dernier message: 21/06/2005, 15h32

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