Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [Java] Ereditarietà

  1. #1

    [Java] Ereditarietà

    Buongiorno a tutti!

    Allora, ho un piccolo problema, vi spiego la situazione:

    Ho una classe astratta chiamata Cromosoma che dichiara una serie di funzioni astratte, tra cui anche:

    abstract public Cromosoma getNewOne();

    Ok.

    Poi ho altre 2 classi astratte che ereditano da Cromosoma: CromosomaBinarioA e CromosomaPermutazioneA.
    Queste classi inziano a definire alcune delle funzioni astratte definite in Cromosoma.

    Infine vi è un'ultima classe MyCromosoma non astratta che eredita da uno a scelta tra CromosomaBinarioA o CromosomaPermutazioneA, a seconda del tipo di rappresentazione che serve per il cromsoma!

    Spiegata la situazione vi illustro qual'è il mio problema:
    con questa gerarchia di classi mi risulta possibile definire il corpo della funzione
    abstract public Cromosoma getNewOne();
    dichiarata in Cromsoma, solamente all'ultimo passo della gerarchia, ovvero in MyCromsoma.
    Questo è spiacevole perchè il corpo della funzione è semplicemente il seguente:

    public Cromosoma getNewOne() {
    Cromosoma c=new MyCromosoma(11);
    c.init();
    return c;
    }

    Cm vede questo metodo non fa nulla di speciale.
    Io avrei voluto mettere la sua definizione nelle due classi astratte intermedie.
    Il problema è che essendo astratte non esiste in costruttore e quindi non posso istanziare il nuovo oggetto.
    Non esiste un modo per dire che il costruttore da usare sarà quello della classe figlia che eredità dalla classe astratta?
    mi spiego. Un qualcosa del tipo:
    Cromosma c=new child(11);
    ???

    Magari sto dicendo solo cavolta, però cm esiste super per riferirsi alal classe padre mi sarebbe comodo anche un modo per riferirsi alla classe figlia!

    Ciao e grazie!

  2. #2
    Non so se ho capito bene cosa vuoi istanziare, ma non credo si possa fare un'operazione del genere

  3. #3
    voglio istanzionare un nuovo cromosoma.

    Al momento ho dovuto fare l'override della funzione getNewOne()
    nelle varie classi MyCromosoma.

    Mi spiego:

    ho una classe MyCromsoma1 extends CromosomaBinarioA

    che all'interno ha il metodo

    public Cromosoma getNewOne(){
    Cromosoma c=new MyCromosoma1(11);
    c.init();
    return c;
    }


    poi ho una classe MyCromosoma2 extends CromosomaPermutazioneA
    che ha il metodo:

    public Cromosoma getNewOne(){
    Cromosoma c=new MyCromosoma2(11);
    c.init();
    return c;
    }

    Cioè per ogni classe che mi erredita da quelle astratte ho la funzione praticamente sempre uguale.

    Mi scoccia dover far riscrivere il codice ogni volta...

  4. #4
    Utente di HTML.it L'avatar di Angelo1974
    Registrato dal
    Feb 2003
    Messaggi
    1,107
    Potresti utilizzare la reflection per risolvere il tuo problema; ad esempio:
    codice:
    public class CromosomaFactory{
      
       public Cromosoma getCormosoma( String type ){
         Cromosoma c = null;
         if( type.equals( "binario" ) ){
           c = new CromosomaBinario(11);
         }else{
           c = new CormosomaPermutazione(11);
          }
          return c;
       }
    }
    Non l'ho provata ed ovviamente è un esempio stupidissimo però potresti costruirti un Factory di Cromosomi Singleton partendo da questo piccolo esempio.
    Spero ti sia utila; ciao
    Se vuoi trovare l'arcobaleno, devi sopportare la pioggia

  5. #5
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    esempio di riflessione http://java.sun.com/docs/books/tutor...t/invoke.html:

    codice:
    import java.lang.reflect.*;
    
    class SampleInvoke {
    
       public static void main(String[] args) {
          String firstWord = "Hello ";
          String secondWord = "everybody.";
          String bothWords = append(firstWord, secondWord);
          System.out.println(bothWords);
       }
    
       public static String append(String firstWord, String secondWord) {
          String result = null;
          Class c = String.class;
          Class[] parameterTypes = new Class[] {String.class};
          Method concatMethod;
          Object[] arguments = new Object[] {secondWord};
          try {
            concatMethod = c.getMethod("concat", parameterTypes);
            result = (String) concatMethod.invoke(firstWord, arguments);
          } catch (NoSuchMethodException e) {
              System.out.println(e);
          } catch (IllegalAccessException e) {
              System.out.println(e);
          } catch (InvocationTargetException e) {
              System.out.println(e);
          }
          return result;
       }
    }
    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  6. #6
    Grazie ragazzi!!!

    Sebbene penso di non aver capito nulla di ciò che mi avete scritto, scopiazando un po' i vostri codici ho trovato uan soluzione accettabile:

    nella classe padre di tutte ho scritto il corpo della funzione
    getNewOne() cm segue

    public Cromosoma getNewOne() {
    Class classe = this.getClass();
    Cromosoma c;
    try {
    c = (Cromosoma) classe.newInstance();
    c.init(parmSize());
    }
    catch (IllegalAccessException ex) {
    System.out.println(ex);
    return null;
    }
    catch (InstantiationException ex) {
    System.out.println(ex);
    return null;
    }
    return c;
    }


    Funziona benissimo!!!

    Grazie ancora

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.