Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    220

    estendere classe astratta

    Ciao gente sapete se esiste qualche tool per automatizzare l'estensione di una classe astratta? Quindi che scriva automaticamente il corpo dei motodi?

    Io volevo estendere Graphics2D......ma ha 70 (settanta) metodi!!! Oddio.... VVoVe:

    In particolare uso eclipse, quindi sapete se c'è un plugin che fa sta cosa??
    Grazzzieee

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: estendere classe astratta

    Originariamente inviato da stirkland
    Ciao gente sapete se esiste qualche tool per automatizzare l'estensione di una classe astratta? Quindi che scriva automaticamente il corpo dei motodi?
    E a che servirebbe? Sei tu che devi sapere se e quali metodi ridefinire e come!

    Originariamente inviato da stirkland
    Io volevo estendere Graphics2D......ma ha 70 (settanta) metodi!!!
    E allora? Prima dovresti spiegare perché devi estendere Graphics2D e cosa devi fare di preciso.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    220
    Se io scrivo
    public class XXX extends Graphics2D mi da un mega errorone perchè si aspetta che implementi (o meglio scriva le interfacce) di TUTTI i metodi. e questo perchè Graphics2D è astratta!

    Graphics2D ha un limite secondo me, cioè il non poter disegnare una Area (che estende Shape) con le "sottoshape" di colori diversi. infatti bisogna settare una volta per tutte il colore scrivendo g.setColor(..).

    Allora ho scritto una classe che dovrebbe sostituirmi Area, che contenga il colore di ogni forma ma ora dovrei riscrivere il metodo "draw(shape)" del mio graphics. Per adesso ho scritto una classe Drawer con un campo Graphics2D ma vorrei usare una classe che estende questa!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da stirkland
    Se io scrivo
    public class XXX extends Graphics2D mi da un mega errorone perchè si aspetta che implementi (o meglio scriva le interfacce) di TUTTI i metodi. e questo perchè Graphics2D è astratta!
    Semplicemente, perché la maggior parte (non tutti, se vai a vedere il javadoc) dei suoi metodi sono astratti. Non perché la classe Graphics2D è astratta (questo vuol solo dire che non è istanziabile).

    Originariamente inviato da stirkland
    Graphics2D ha un limite secondo me, cioè il non poter disegnare una Area (che estende Shape) con le "sottoshape" di colori diversi. infatti bisogna settare una volta per tutte il colore scrivendo g.setColor(..).

    Allora ho scritto una classe che dovrebbe sostituirmi Area, che contenga il colore di ogni forma ma ora dovrei riscrivere il metodo "draw(shape)" del mio graphics. Per adesso ho scritto una classe Drawer con un campo Graphics2D ma vorrei usare una classe che estende questa!
    Innanzitutto bisogna tenere in considerazione come vengono gestiti i Graphics. Non è il programmatore che di norma istanzia un Graphics/Graphics2D ma è il framework che ne fornisce una implementazione concreta in base al contesto in cui deve essere usato. Un Graphics potrebbe rappresentare il "contesto" relativo ad una finestra a video o ad una immagine off-screen o a una superficie stampabile di una stampante.

    Quindi implementare concretamente i metodi di un Graphics richiede appunto la conoscenza completa del contesto in cui dovrà essere usato. E non è quello che devi fare tu. Da quello che dici devi solo aggiungere delle funzionalità, non realizzare un nuovo "contesto".


    L'unica cosa, secondo me, che puoi fare è un "wrapper". Una cosa del genere:

    codice:
    class MyGraphics extends Graphics2D
    {
        private Graphics2D g;
    
        public MyGraphics (Graphics2D g) { this.g = g; }
    
        public void clearRect(int x, int y, int width, int height) {
            g.clearRect(x, y, width, height);
        }
    
        ... ridefinisci tutti i metodi di Graphics2D in modo che invochino su g ...
    
        ... tuoi metodi specifici ...
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    220
    Appunto, proprio quello che voglio fare!! Solo che i metodi da ridefinire sono tantissimi.....
    e se non li definisco tutti non mi lascia in pace!

  6. #6
    Hai provato a vedere su eclipse premendo destro sopra la classe Graphics2D e andare su source e vedere se tu da metodi particolari?

    Ad esempio per fare tutti i metodi getter e setter c'è il bottone apposta poi t chiede solo che variabili fare il setter e il getter e sei apposto...magari c'è lo stesso anche per i metodi astratti...

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da stirkland
    Appunto, proprio quello che voglio fare!! Solo che i metodi da ridefinire sono tantissimi.....
    e se non li definisco tutti non mi lascia in pace!
    Fai un copia/incolla dalla lista dei metodi sul javadoc o direttamente dai sorgenti di Graphics/Graphics2D (tranciando via commenti e altro che non serve) e in 15~20 minuti hai definito tutti i metodi in modo che invochino il metodo sul Graphics interno alla classe.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    220
    wow si può!!! ho fatto come mi dice nirvana e si può!!!
    OOOOOttimo!!!!

    Graz!


    ps.
    cmq pure da javadoc si poteva...non ci avevo pensato

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    220
    Adesso xò ho un altro problema...sigh

    ho esteso Graphics2D:

    codice:
    public class Graph extends Graphics2D {
    
    	private Graphics2D g;
    
    	public void drawArea(ImageArea area) {
    		ImageShape img;
    		Iterator<ImageShape> it = area.getShapes().iterator();
    
    		while (it.hasNext()) {
    			img = it.next();
    
    			g.setColor(img.getColor());
    			g.fill(img.getShape());
    		}
    	}
    
    	public void addRenderingHints(Map<?, ?> hints) {
    		g.addRenderingHints(hints);
    	}
    
    	public void clearRect(int x, int y, int width, int height) {
    		g.clearRect(x, y, width, height);
    	}
    
            // ecc ecc...
    come vedete ho implementato quell'unico nuovo metodo che mi interessava, cioè drawArea, mentre ho generato automaticamente tutti gli altri metodi!!

    Ora quando vado a disegnare:
    codice:
    Graphics2D g2d = (Graphics2D) g;
    ((Graph) g2d).drawArea(new Gorilla(100, 100).toImage());
    oppure anche solo:
    codice:
    ((Graph) g).drawArea(new Figura(100, 100).toImage());
    con g di tipo Graphics passato come parametro al metodo, mi solleva una ClassCastException!!

    Perchè??

  10. #10
    Allora hai un problema di Casting.....non conosco le classi da te importate e usate ma posso capire lo stesso che forse hai problemi con il casting.....
    A me suona male questo comando
    ((Graph) g).drawArea(new Figura(100, 100).toImage());
    Che roba è? Perchè hai usato doppio parentesi?Ti conviene fare prima le cose bene poi in un secondo momento abbreviare....crea un nuovo oggetto graph e poi fallo diventare uguale a g....e fai il tutto.....
    Con il casting tutto diventa compresso e anche complesso da analizzare....

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.