Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [JAVA] Realizzare astrazioni polimorfiche, help me per capire quello che dice la prof

    mmm,
    stò studiando le astrazioni polimorfiche in Java ma purtroppo mi sono accorto che quelle due pagine di appunti sono più o meno incomprensibili anche per me che le ho scritte perchè ho scritto un casino...quello che sono riuscito a decriptare dalla mia calligrafia è questo...

    Praticamente si vuole realizzare un algoritmo di ordinamento su array e si vuole che tale algoritmo funzioni per ogni tipo di dato.

    Per fare ciò viene definito un nuovo tipo di dato Confrontabile mediante un'interface che rappresenta appunto tipi confrontabili (così l'algoritmo funzionerà allo stesso modo su un array di interi così come su un array di double, etcetc)

    Quindi:
    codice:
    public interface Confrontabile(){
    	public boolean minoreDi(Confrontabile);
    }
    Poi alla pagina dopo trovo questo codice che dovrebbe essere il codice del metodo di ordinamento in loco, che però non c'è scritto il nome del metodo ne in quale classe deve essere messo :muro: :muro: :muro: :muro:

    codice:
    public static void(Confrontabile[] x){		// METODO DI ORDINAMENTO ?!?!
    	
    	Confrontabile c;		// Dichiaro una variabile c di tipo Confrontabile (tipo generico per confrontare tutte le implementazioni di Confrontabile?)
    	int i,j,n;				// Dichiaro 3 variabili intere che uso come indici e contatori
    	
    	for(i=0; i<x.length; i++){		// Scorri l'array x di tipo Confrontabile dal primo all'ultimo elemento
    		c = x[i];				// E ad ogni iterazione metti in c il riferimento all'i-esimo oggetto presente nell'array
    		
    		for(j=i+1; j<x.length; j++){		// Ciclo interno che scorre l'array x a partire dall'(i+1)-esimo elemento
    			if(x[j].minoreDi[c]{			// Se l'(i+1)-esimo elemento dell'array è minore del precedente puntato da c
    				c = x[j];					// Metti in c il riferimento all'(i+1)-esimo elemento
    				n = j;						// Metti in n l'indice dell'(i+1)-esimo elemento
    			} 
    			
    			x[n] = x[i];	// Scambia in loco il valore contenuto nell'i-esimo elemento e mettilo alla posizione (i+1)-esima
    			x[i] = c;		// Scambia in loco e metti il riferimento al vecchio (i+1)-esimo elemento in posizione i
    		}
    	} // Così alla fine l'array di Confrontabili è stato ordinato in loco a prescindere da qual'è il tipo effettivo di x
    Ed infine ho la definizione del tipo IntConfrontabile che implementa l'interfaccia e contiene l'implementazione del metodo minoreDi() per confrontare tra loro gli elementi di un array di interi (poi ad esempio potrei implementare altri tipi di dato come StringConfrontabile che a sua volta conterà la relativa implementazione di minoreDi() per confrontare le stringhe in base a qualche criterio)

    codice:
    /* Ha delle funzionalità in più rispetto ad Integer: le funzionalità dell'interface */
    public class IntConfrontabili extends Integer implements Confrontabile{
    	
    	/* REQUIRES: y deve essere di tipo IntConf */
    	public boolean minoreDi(Confrontabile y){
    		boolean b = false;
    		
    		if(intValue() < ((IntConf).intValue())
    			b = true
    			
    		return b;
    	}
    }
    Il ragionamento l'ho capito: dichiaro un tipo di dato Confrontabile il più generico possibile mediante un'interface che contiene un metodo minoreDi(), poi implemento l'interface per ogni sottotipo di array confrontabili tra di loro ed in tali implementazioni ci caccio dentro il codice del metodo che sa confrontare gli elementi di un array omogeneo per quel tipo di collezione.
    Nell'algoritmo di ordinamento opero sul tipo generico Confrontabile e verrà richiamato il codice del metodo corretto...ok...ma in pratica da questi appunti non sò come metere insieme il tutto:

    1) L'algoritmo di ordinamento in che classe dovrebbe stare? e che nome dovrebbe avere? booo

    2) In IntConfrontabile chi cavolo è intValue() ?

    3) Confrontabile è solo un'interface e non ha rappresentazione, allora in IntConfrontabile non ci dovrebbe essere anche un array di istanza di tipo int ed il relativo costruttore?

    4) Perchè oltre ad implementare Confrontabile gli fa estendere Integer?

    Per favore aiutatemi che stò un po' disperato....

    Grazie
    Andrea

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

    Re: [JAVA] Realizzare astrazioni polimorfiche, help me per capire quello che dice la prof

    Originariamente inviato da AndreaNobili
    Per fare ciò viene definito un nuovo tipo di dato Confrontabile mediante un'interface che rappresenta appunto tipi confrontabili
    A dire il vero nel framework di Java ci sono già le interfacce Comparable e Comparator .... proprio per questi scopi.

    Originariamente inviato da AndreaNobili
    codice:
    public class IntConfrontabili extends Integer implements Confrontabile{
    	
    	/* REQUIRES: y deve essere di tipo IntConf */
    	public boolean minoreDi(Confrontabile y){
    ...
    ...
    Questo NON ha senso. Intendo la estensione di Integer. La classe Integer è final ovvero NON può essere estesa.

    Originariamente inviato da AndreaNobili
    1) L'algoritmo di ordinamento in che classe dovrebbe stare? e che nome dovrebbe avere?
    Dove vuoi. Se noti il metodo che effettua l'ordinamento è static, non è legato ad alcuna istanza (non avrebbe senso visto che opera solo sull'array passato come argomento).
    Pertanto puoi metterlo in una classe di "utility", es. Algoritmi o Ordinamenti. Se vai a vedere nel framework di Java, c'è una classe java.util.Collections (non istanziabile) che contiene solo metodi static per varie utilità: max(), min(), sort() e tanti altri.

    Originariamente inviato da AndreaNobili
    2) In IntConfrontabile chi cavolo è intValue() ?
    Integer è la classe "wrapper" del tipo primitivo int. Il metodo intValue() ritorna il tipo primitivo "incapsulato" nel Integer.

    Originariamente inviato da AndreaNobili
    3) Confrontabile è solo un'interface e non ha rappresentazione, allora in IntConfrontabile non ci dovrebbe essere anche un array di istanza di tipo int ed il relativo costruttore?
    A parte quanto ho detto sopra circa l'estensione, no non avrebbe senso. Quella classe in teoria dovrebbe SOLO dire se un Integer è minore di un altro Integer. Non dovrebbe contenere nulla a livello di "stato" (variabili di istanza).

    Ma comunque è sbagliata.

    Originariamente inviato da AndreaNobili
    4) Perchè oltre ad implementare Confrontabile gli fa estendere Integer?
    Già detto sopra. Quella estensione non può essere fatta.

    Originariamente inviato da AndreaNobili
    Per favore aiutatemi che stò un po' disperato....
    Probabilmente con i libri di testo che hai sarei disperato pure io .....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.