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 :

Classe interne étendant une classe externe abstraite


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 26
    Points : 14
    Points
    14
    Par défaut Classe interne étendant une classe externe abstraite
    Salut,

    Cette structure est-elle impossible à instancier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    abstract class Fruit {
     
    	abstract void mange();
     
    	final class Banane extends Fruit {
    		void mange() {
    			System.out.println("Y'a bon!");
    		}
    	}
     
    }
    ?

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Points : 2 336
    Points
    2 336
    Par défaut
    Quel intérêt de placer une class interne dans une class abstraite ?

  3. #3
    Membre éclairé
    Avatar de sironimo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 669
    Points : 756
    Points
    756
    Par défaut
    +1
    "Le calendrier, c'est la bureaucratie du temps." Quino

  4. #4
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    Bonjour

    Citation Envoyé par *alexandre*
    Quel intérêt de placer une class interne dans une class abstraite ?
    La classe abstraite java.util.AbstractList contient une classe interne Itr (Iterator).

    Par contre je n'ai pas compris la question de janef...

    Tu ne peux rien instancier d'une autre classe. :
    - Fruit n'est pas instanciable.
    - Banane n'est pas instanciable car doit être liée à une instance de Fruit qui n'est pas instanciable.

    Tu peux instancier Banane depuis le code de Fruit de la manière suivante :

    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 Fruit {
     
    	abstract void mange();
     
    	final class Banane extends Fruit {
    		void mange() {
    			System.out.println("Y'a bon!");
    		}
    	}
     
    	public void testBanane() {
    		this.new Banane().mange();
    	}
     
    }
    Pour instancier un Fruit depuis l'extérieur, tu peux faire comme ça :

    Class Fruit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    abstract class Fruit {
     
    	abstract void mange();
     
    	public static final class Banane extends Fruit {
    		void mange() {
    			System.out.println("Y'a bon!");
    		}
    	}
    }
    Classe de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Test {
    	public static void main(String[] args) {
    		Fruit fruit = new Fruit.Banane();
    		fruit.mange();
    	}
    }
    voili voilou

  5. #5
    Membre éclairé
    Avatar de sironimo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 669
    Points : 756
    Points
    756
    Par défaut
    Citation Envoyé par yann2
    La classe abstraite java.util.AbstractList contient une classe abstraite Itr (Iterator)
    Citation Envoyé par *alexandre*
    Quel intérêt de placer une class interne dans une class abstraite ?
    Ici on parle d'une classe interne non abstraite je pense que c'est ça qui nous a échappé avec alexandre
    "Le calendrier, c'est la bureaucratie du temps." Quino

  6. #6
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    Citation Envoyé par sironimo
    Ici on parle d'une classe interne non abstraite je pense que c'est ça qui nous a échappé avec alexandre
    Itr n'est pas abstraite Je me suis emmêlé les pinceaux (et j'ai édité). Itr est bien une classe interne concrète !

  7. #7
    Membre éclairé
    Avatar de sironimo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 669
    Points : 756
    Points
    756
    Par défaut
    autant pour moi. Ok pour l'exemple mais quel est l'intérêt ?
    "Le calendrier, c'est la bureaucratie du temps." Quino

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Points : 2 336
    Points
    2 336
    Par défaut
    ca reste louche comme conception

    je veux bien que pour une class Tree elle possède une class Cell en interne qui elle contient une entité générique

    mais pour une classe qui peut etre utilisé en externe (une banane) c est mal fait

  9. #9
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    re

    Citation Envoyé par *alexandre*
    ca reste louche comme conception

    je veux bien que pour une class Tree elle possède une class Cell en interne qui elle contient une entité générique

    mais pour une classe qui peut etre utilisé en externe (une banane) c est mal fait
    Oui c'est clair que là... mais c'est certainement un petit exemple.

    [edit]Arf, suppression, j'avais pô compris du premier coup. Je suis un cerf volant.[edit]

  10. #10
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Il se fait tard et j'étudierai vos réponses demain. Disons juste pour répondre à la remarque initiale que :

    La classe interne possède les avantages de sa position (accès aux private...). La classe externe n'ayant jamais besoin d'être instanciée, c'est plus propre à mon goût de la déclarer abstract, et de même pour la méthode plutôt que d'en mettre une inopérante dans Fruit et de la surcharger dans Banane quand on a besoin de tirer un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fruit banane = new Banane();
    (du moins si c'était possible de cette façon).

  11. #11
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    Salut

    Citation Envoyé par janef
    Il se fait tard et j'étudierai vos réponses demain. Disons juste pour répondre à la remarque initiale que :

    La classe interne possède les avantages de sa position (accès aux private...). La classe externe n'ayant jamais besoin d'être instanciée, c'est plus propre à mon goût de la déclarer abstract, et de même pour la méthode plutôt que d'en mettre une inopérante dans Fruit et de la surcharger dans Banane quand on a besoin de tirer un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fruit banane = new Banane();
    (du moins si c'était possible de cette façon).
    Dans ce cas là, tu peux faire une classe externe (tu passes les attributs de Fruit en protected ou tu ajoute des méthodes d'accès de visibilité protected ou public, selon le besoin).

  12. #12
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Points : 2 336
    Points
    2 336
    Par défaut
    T'es fou ? ta classe banane serait instancié a quelle moment ?

    Je sais pas si tu te rends compte de l'erreur de conception de la définition d'une classe interne (non generic) dans une classe abstraite !

  13. #13
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut
    Bonjour

    Citation Envoyé par *alexandre*
    T'es fou ? ta classe banane serait instancié a quelle moment ?

    Je sais pas si tu te rends compte de l'erreur de conception de la définition d'une classe interne (non generic) dans une classe abstraite !
    Euh.. c'est à moi que tu dis ça ou à Janef. Parce que j'ai bien dis de faire une classe externe (enfin une classe quoi).

  14. #14
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Points : 2 336
    Points
    2 336
    Par défaut
    lol rassure toi

  15. #15
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Et pourtant, le problème s'est posé tout naturellement.
    Voici quelque chose qui ressemble plus à mon objectif. Cet exemple fonctionne parce que j'en ai retiré les abstract.
    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
     
    class Fruit {
     
    	private String avec="Avec la chantilly : ";
     
    	void mange() { }
     
    	final class Banane extends Fruit {
    		void mange() {
    			System.out.println(avec+"Y'a bon!");
    		}
    	}
     
    	final class Piment extends Fruit {
    		void mange() {
    			System.out.println(avec+"Beurk!");
    		}
    	}
     
    }
    Et on teste :
    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
     
    class Test {
     
    	public static void main(String[] args) {
     
    		if(args.length==1) {
    			Fruit fruit=new Fruit();
    			if(args[0].equals("banane")) {
    				fruit=fruit.new Banane();
    			} else if(args[0].equals("piment")) {
    				fruit=fruit.new Piment();
    			}
    			fruit.mange();
    		}
    	}
     
    }
    Mais étant donné que Fruit joue un rôle mi-interface, mi-classe, la déclaration abstract me semblerait plus propre et plus rationnelle.

Discussions similaires

  1. Réponses: 12
    Dernier message: 18/01/2013, 13h15
  2. Réponses: 2
    Dernier message: 13/05/2008, 10h02
  3. Réponses: 2
    Dernier message: 02/02/2008, 07h37
  4. Class interne dans une classe template
    Par MatRem dans le forum Langage
    Réponses: 26
    Dernier message: 15/06/2006, 10h45
  5. [POO] Classe interne à une classe, est ce possible ?
    Par Matth_S dans le forum Langage
    Réponses: 13
    Dernier message: 10/02/2006, 10h24

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