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 :

[Conception] Héritage sur Plusieurs classes abstraites


Sujet :

Langage Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    279
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 279
    Points : 102
    Points
    102
    Par défaut [Conception] Héritage sur Plusieurs classes abstraites
    Bonjour,

    J'ai deux classes abstraites "Job" et "ProcessObject", dans "Job" y'a plusieurs méthodes, les plus importantes sont :

    - Executer (abstraite)
    - Pause (public)
    - Progression (public)

    dans la classe "ProcessObject" , la méthode la plus importante est :
    - Traitement (public) invoque d'autres methodes de la classe.

    la méthode "Traitement" contient une boucle et doit utiliser les methodes "Pause et Progression".

    Je voudrais faire une classe héritant des deux (c'est impossible...) au debut j'ai penser a faire une nouvelle classe comme "ProcessObject" en héritant de "Job", mais en fesant ca, un jour si je modifier la classe "ProcessObject" je doit aussi faire les changement dans la nouvelle.

    Quel est le moyen de faire une nouvelle classe qui doit utiliser les deux classe abstraite en redéfinissant la méthode "Traitement" ?

    PS : Je ne c'est pas quel partie de code doit-je mettre

  2. #2
    Membre habitué
    Profil pro
    Dev NodeJS
    Inscrit en
    Août 2006
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev NodeJS

    Informations forums :
    Inscription : Août 2006
    Messages : 177
    Points : 181
    Points
    181
    Par défaut
    Tu ne peux pas utiliser d'interface?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Octobre 2007
    Messages : 27
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par yciabaud Voir le message
    Tu ne peux pas utiliser d'interface?
    Java ne permet pas, au contraire d'autres langages, l'héritage multiple. Mais le système d'interface pourrait résoudre ton problème.

    Mais, à part si c'est une demande précise, reprends l'analyse du problème ...

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    structurellement, le plus simple serait de passer un instance de Job en paramètre à ton processObject, et ainsi avoir ton processObject qui utilise ce job:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class ProcessObject {
        private Job job;
     
        public traitement(){
           job.progression();
           job.pause();
       }
    }

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    279
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 279
    Points : 102
    Points
    102
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    structurellement, le plus simple serait de passer un instance de Job en paramètre à ton processObject, et ainsi avoir ton processObject qui utilise ce job:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class ProcessObject {
        private Job job;
     
        public traitement(){
           job.progression();
           job.pause();
       }
    }
    - Je peut pas passer une instance du Job, c'est une classe abstraite en peut pas l'instancier.

    - Je ne peut pas aussi modifier la classe ProcessObject

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par facilus68 Voir le message
    - Je peut pas passer une instance du Job, c'est une classe abstraite en peut pas l'instancier.
    C'est pas parce qu'elle est abstraite que tu ne peux pas la manipuler. Tu peux très bien instancier une sous classe.

    - Je ne peut pas aussi modifier la classe ProcessObject
    Alros j'ai du mal à voir comment tu envisage d'y faire entrer le job! Si tu nous montrait ton code et ce que tu essaie de faire, c'est un peu flou là.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    279
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 279
    Points : 102
    Points
    102
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    C'est pas parce qu'elle est abstraite que tu ne peux pas la manipuler. Tu peux très bien instancier une sous classe.


    Alros j'ai du mal à voir comment tu envisage d'y faire entrer le job! Si tu nous montrait ton code et ce que tu essaie de faire, c'est un peu flou là.
    Doit je mettre tout le code de la classe ou seulement les methode concernée ?

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    commence par ce qui nous concerne

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    279
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 279
    Points : 102
    Points
    102
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    commence par ce qui nous concerne
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    abstract public class Job implements InterruptableJob {
    
     // declaration des attributs
    
    public void execute(JobExecutionContext ctxt) {
    		try {
    			sch = EcaScheduler.getInstance();
    
    			// verifier si une instance s'execute deja
    
    			trigger = ctxt.getTrigger();
    
    			Set<String> set = sch.getRunningPlanifications().keySet();
    			if (set.contains(trigger.getName()))
    				return;
    
    			this.data = ctxt.getJobDetail().getJobDataMap();
    
    			this.nom = ctxt.getJobDetail().getName();
    			this.context = ctxt;
    
    			nomTrigger = trigger.getName();
    			// this.merge = ctxt.getMergedJobDataMap();
    			data.put(trigger.getName(), false);
    			// ajouter l'instance au scheduler
    			sch.registerJob(this, trigger);
    
                            // methode redéfinie dans les sous classes
    			process();
    
    
    			if (howStopped) {
    				data.put(EcaScheduler.INTERRUPT_JOB, "ok");
    			} else {
    				data.put(EcaScheduler.INTERRUPT_JOB, "user");
    			}
    			sch.unregisterJob(this, trigger);
    		} catch (Exception e) {
    			JobExecutionException e2 = new JobExecutionException(e);
    			System.out.println(EcaStringUtils.getStackTraceAsString(e2));
    			data.put(EcaScheduler.INTERRUPT_JOB, EcaStringUtils.getStackTraceAsString(e2));
    			sch.unregisterJob(this, trigger);
    		}
    	}
    
    public abstract void process();
    
    	public synchronized void checkForPause() {
    
    		while ((Boolean) data.get(trigger.getName())) {
    			try {
    				pauseState = true;
    				resumeState = false;
    				wait();
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    
    	}
    }
    
    // exemple de sous classe
    public SubJob1 extends Job{
    
      public void process() {
         while (...) {
              checkForPause();
          }
     }
    }
    Voici la 2eme Classe ObjectProcess :

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    public abstract class ObjectProcess<T extends PersistentObjectImplProxyInterface> {
     
         // declaration des attributs.
     
         // methodes de la classe
     
         protected abstract void processObject(T object, OutputReport reportLog, Session session) throws Exception;
     
    protected abstract Collection<Long> getObjectsIds(Session session, OutputReport reportLog);
     
    public void processObjects(OutputReport reportLog) {
    			exceptionsCount = 0;
    				if (reportLog == null) 
    					reportLog = new EcaOutputReport(); //pour ne pas avoir de nullPointerException
     
    				log.info("start processObjects");
    				reportLog.info("start processObjects");
    				Session tempSession = HibernateUtil.getSessionFactory().openSession();
     
    				log.info("start getObjectIds");
    				reportLog.info("start getObjectIds");
    				Collection<Long> objectsIds = getObjectsIds(tempSession, reportLog);
    				log.info("end getObjectIds");
    				reportLog.info("end getObjectIds");
    				tempSession.clear();
    				tempSession.close();
     
     
    				setCurrentCount(0);
    				setObjectsCount(objectsIds.size());
    				while (!objectsIds.isEmpty()) {
    					Session session = HibernateUtil.getSessionFactory().openSession();
    					Collection<Long> idsToLoad = new ArrayList<Long>();
    					int loadCount = 0;
    					for (Iterator<Long> objectsIdsIterator = objectsIds.iterator(); objectsIdsIterator.hasNext() && loadCount < objectsToLoad;) {
    						loadCount++;
    						idsToLoad.add(objectsIdsIterator.next());
    						objectsIdsIterator.remove();
    					}
     
    					Collection<T> objectsToTreat = null;
    					if (!idsToLoad.isEmpty()){
    						log.info("start loadObjects");
    						reportLog.info("start loadObjects");
    						objectsToTreat = loadObjects(session, idsToLoad);
    						log.info("end loadObjects");
    						reportLog.info("end loadObjects");
    					} else {
    						objectsToTreat = new ArrayList<T>();
    					}
    					processObjectsGroup(reportLog, session, objectsToTreat);
    					session.clear();
    					session.close();
     
    					onProcess();
    				}
    				log.info("exceptions : "+exceptionsCount);
    				reportLog.info("exceptions : "+exceptionsCount);
    				log.info("end process objects");
    		}
     
    protected abstract Collection<T> loadObjects(Session session, Collection<Long> ids);
     
    }

    Pour réexpliker :

    a l'interieur de la methode "processObjects" ya une boucle while, je veut lui mettre les methode du "Job" comme celle de "SubJob1" mais sans réecrire ni la Classe "Job" ni "ObjectProcess", je veux faire une sous classe comme "Subjob1" en rajoutant les foncionalité de "ObjectProcess" voila , je ne c'est pas si le code suffit, ou doit je rajouter des details.

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    donc tu veux mettre dans le while de objectProcess, du code venant de Job, sans modifier objectProcess. C'est assez contradictoire de vouloir modifier objectProcess sans modifier objectProcess ..... Un peu contradictoire. dans tous les cas, pour le code que tu rajoute tu peux très bien faire appel à une instance de Job qu'on t'aurais passé en paramètre. Il suffit de remplacer le xxxx() que tu aurais fait en "héritage multiple" par job.xxxx(); (en utilisant le design pattern "delegate"). Bien entendu tu ne peux pas créer directement une instance de job, mais tu peux créer une instance d'une sous-classe qui n'est pas abstraite.

    Si tu veux plus de précisions, modifie ta boucle while en ajoutant ce que tu veux comme code (même si il est incorrect), qu'on puisse te guider plsu en détail.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/09/2012, 17h37
  2. [Conception] Requête sur plusieurs tables
    Par masseur dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 16/03/2008, 17h22
  3. Erreur du designer avec héritage d'une classe abstraite
    Par Xzander dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/04/2007, 00h36
  4. Conception: héritage d'une classe abstraite
    Par Kikito dans le forum Langage
    Réponses: 19
    Dernier message: 05/10/2006, 17h36
  5. [Hibernate] Héritage sur plusieurs niveaux
    Par srvremi dans le forum Hibernate
    Réponses: 2
    Dernier message: 31/05/2006, 18h39

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