Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
REDMI Note 17 Pro porta in fascia media una batteria da 8.340 mAh con ricarica HyperCharge a 67W, un display AMOLED da 6,83 pollici capace di picchi di luminosità molto elevati e una struttura certificata TÜV SÜD contro cadute e infiltrazioni d'acqua, il tutto racchiuso in una scocca da 223 grammi. Lo abbiamo provato per diversi giorni tra fotocamera, prestazioni, autonomia e prezzo sul mercato italiano
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-05-2009, 18:52   #1
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
[JAVA] Implementazioni multiple

Ragazzi,
stò un po' impicciato perchè il libro di testo del corso di metodologie di programmazione se per la parte teorica è molto chiaro...appena si addentra in esempi pratici mi pare un po' delirante anche perchè inizia gli esempi ma li lascia sempre parzialmente implementati (poi ditemi voi...magari sono stupido io)

Praticamente per spiegare la possibilità in Java di realizzare implementazioni multiple fà questo esempio:

Ho una classe abstract IntList che rappresenta l'astrazione di una lista di interi, tale classe non ha alcuna rappresentazione (non ha variabili di istanza), ha alcuni metodi definiti come abstract ed altri metodi implementati che vanno bene per tutte le varie possibili estensioni e che veranno ereditati dalle estensioni (è giusta sta cosa?)

Poi estendo tale classe abstract mediante 2 classi concrete:
EmptyIntList che rappresenta la lista vuota e FullIntList che rappresenta una lista che contiene qualcosa (e già per questo motivo mi sembra un esempio stupido...non ha molto senso secondo me rappresentare un tipo di dato lista vuota con tutti metodi più o meno inutili)

Il codice delle 3 classi è il seguente:

CODICE IntList:
Codice:
/* Esempio di astrazione di un IntList (lista di interi). Viene usata una sottoclasse per rappresentare una lista vuota ed
   un'altra sottoclasse per implementare la lista non vuota. Il tipo in cima alla gerarchia di tipi è definito da una classe
   astratta (IntList) che non ha variabili di istanza e non c'è costruttore.
   I metodi toString() ed equals() sono implementati usando l'iteratore elements(). Vengono fornite due definizioni per
   il metodo equals() (cioè equals è un metodo overloaded) per aumentare le performance nel caso comune in cui il codice
   chiamato controlla l'uguaglianza di due oggetti IntList */

public abstract class IntList{
	// OVERVIEW: IntList è una lista immutabile di Object, una tipica IntList è una sequenza: [X1, X2,....,Xn]
	
	// METODI ABSTRACT:
	
	public abstract Object first() throws EmptyException;
		// EFFECTS: Se this è vuoto solleva EmptyException, altrimenti ritorna il primo elemento di this
		
	public abstract IntList rest() throws EmptyException;
		/* EFFETCTS: Se this è vuoto solleva EmptyException, altrimenti ritorna la lista contenente tutti gli elementi
					 meno il primo elemento di this nell'ordine originale */
				
	public abstract Iterator elements();
		// EFFECTS: Ritorna un generatore che produce gli elementi di this esattamente una volta nell'ordine originale
		
	public abstract IntList addE1(Object x);
		// EFFECTS: Aggiungi x all'inizio di this
		
	public abstract int size();
		// EFFECTS: Ritorna il numero di elementi presenti in this
	
	public abstract boolean repOK();
	
	// METODI IMPLEMENTATI:
	
	/* public String toString(){
		.....
		.....
		.....
	}  */
	
	public boolean equals(Object o){
		try{
			return equals ((IntList) o);
		}catch(ClassCastException e){ return false;}
	}
	
	/* public booleans equals(IntList o){
		.....
		.....
		.....
	} */
}
CODICE EmptyIntList:
Codice:
public class EmptyIntList extends IntList{			// Questa classe estende la classe astratta IntList
	
	/** COSTRUTTORE
		EFFECTS: Crea un nuovo oggetto di tipo EmptyList
		@param: void
		@return: il riferimento ad un nuovo oggetto di tipo EmptyIntList */
	public EmptyIntList(){};			// Viene semplicemente invocato il costrutore della classe padre IntList
	
	public Objcet first() throws EmptyException{
		throw new EmptyException("EmptyIntList.first");	// Essendo la lista vuota solleva sempre l'eccezione EmptyIntList
	}
	
	public IntList addE1(Object x){
		return new FullIntList(x);		// Crea una nuova FullIntList passandogli l'elemento che verrà messo in testa
	}
	
	public boolean repOK(){
		return true;
	}
	
	public String toString(){
		return "IntList: []";
	}
	
	public booleans equals(Object x){
		return (x instanceof EmptyList);
	}
	
	// Quì và l'implementazione di rest() e di size()
	
	public Iterator elements(){
		return new EmptyGen();
	}
	
	static private class EmptyGen implements Iterator{
		EmptyGen(){			// Costruttore: richiama il costruttore di Iterator
		}	
		
		public boolean hasNext(){
			return false;			// Ritorna sempre falso perchè è l'iteratore sulla lista vuota
		}
		
		public Object next() throws NoSuchElementException{
			throw new NoSuchElementException("IntList.elements");
		}
	}
}
CODICE FullIntList:
Codice:
public class FullIntList extends IntList{
	private int size;
	private Object val;
	private IntList next;
	
	/** COSTRUTTORE 
		EFFECTS: Crea un nuovo oggetto di tipo FullIntList
		@param: un Object
		@return: il riferimento ad un oggetto di tipo FullIntList */
		
	public FullIntList(Object x){
		size = 1;		// Quando crea una nuova FullIntList setta ad 1 la dimensione poichè inizialmente conterrà un valore
		val = x;		// Imposta il campo val col il riferimento all'Object x
		next = new EmptyList();		// Fai puntare il campo next ad una nuova lista vuota
	}
	
	public Object first(){
		return val;
	}
	
	public Object rest(){
		return next;
	}
	
	public IntList addE1(Object x){
		FullIntList n = new FullIntList(x);
		n.next = this;
		n.size = this.size + 1;
		return n;
	}
	
	// Quì implementazione dei metodi elements(), size(), repOK()
}
Come dicevo il codice è parzialmente implementato.

DOMANDE:

1) Nella classe abstract si dichiara un metodo equals che prende come parametro un Object, lo casta ad IntList e chiama: equals ((IntList) o) che ha dichiarato e di cui non ha implementato il codice...perchè lo fà? Perchè così potrei passargli indistintamente un EmptyIntList così come un FullIntList che vengono convertiti ad IntList e confrontati?

2) Nella classe abstract che senso ha dichiarare il metodo toString() (che fornisce una rappresentazione sotto forma di stringa degli oggetti) se poi lo reimplementa in EmptyIntList? (e perchè non lo ha reimplementato anche in FullIntList)

3) Ma l'eccezione EmptyException in IntList se l'è dichiarata lui da qualche altra parte (che non dice)? perchè il compilatore non la conosce.

4) Ma pare solo a me che l'esempio è fatto un po' alla cavolo sotto vari punti di vista: a partire dalla bruttezza di astrarre una lista vuota ed una lista piena (io forse avrei pensato ad astrarre da una generica lista una lista di interi, una lista di double, una lista di stringhe, etcetc...mi pare più sensata ed utile come cosa).

Grazie
Andrea
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 18-05-2009, 09:27   #2
Energy++
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 1060
1) Perchè così potrei passargli indistintamente un EmptyIntList così come un FullIntList che vengono convertiti ad IntList e confrontati? si

2) Nella classe abstract che senso ha dichiarare il metodo toString() (che fornisce una rappresentazione sotto forma di stringa degli oggetti) se poi lo reimplementa in EmptyIntList? (e perchè non lo ha reimplementato anche in FullIntList)
si ha senso, poi lo puoi implementare o non implementare nelle classi derivate (infatti in EmptyIntList è implementato e in FullIntList non è implementato)

3) Ma l'eccezione EmptyException in IntList se l'è dichiarata lui da qualche altra parte (che non dice)? perchè il compilatore non la conosce.
Sicuramente l'ha dichiarata da qualche parte, perchè non si trova nel framework di java

4) Ma pare solo a me che l'esempio è fatto un po' alla cavolo sotto vari punti di vista: a partire dalla bruttezza di astrarre una lista vuota ed una lista piena (io forse avrei pensato ad astrarre da una generica lista una lista di interi, una lista di double, una lista di stringhe, etcetc...mi pare più sensata ed utile come cosa).
beh sicuramente questa gerarchia è stata implementata per fornire soltanto un esempio a grandi linee, non per realizzare qualcosa di veramente funzionale
Energy++ è offline   Rispondi citando il messaggio o parte di esso
Old 18-05-2009, 09:37   #3
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2688
Quote:
Originariamente inviato da Energy++ Guarda i messaggi
1) Perchè così potrei passargli indistintamente un EmptyIntList così come un FullIntList che vengono convertiti ad IntList e confrontati? si

2) Nella classe abstract che senso ha dichiarare il metodo toString() (che fornisce una rappresentazione sotto forma di stringa degli oggetti) se poi lo reimplementa in EmptyIntList? (e perchè non lo ha reimplementato anche in FullIntList)
si ha senso, poi lo puoi implementare o non implementare nelle classi derivate (infatti in EmptyIntList è implementato e in FullIntList non è implementato)

3) Ma l'eccezione EmptyException in IntList se l'è dichiarata lui da qualche altra parte (che non dice)? perchè il compilatore non la conosce.
Sicuramente l'ha dichiarata da qualche parte, perchè non si trova nel framework di java

4) Ma pare solo a me che l'esempio è fatto un po' alla cavolo sotto vari punti di vista: a partire dalla bruttezza di astrarre una lista vuota ed una lista piena (io forse avrei pensato ad astrarre da una generica lista una lista di interi, una lista di double, una lista di stringhe, etcetc...mi pare più sensata ed utile come cosa).
beh sicuramente questa gerarchia è stata implementata per fornire soltanto un esempio a grandi linee, non per realizzare qualcosa di veramente funzionale
Ti ringrazio...comunque uno scopo utile delle implementazioni multiple potrebbe essere il seguente?

Dichiaro un'interface Confrontabili da cui implemento varie sottoclassi concrete di oggetti che sono confrontabili tra di loro.

Oppure dichiaro un'interface Lista e vado ad implementare le sottoclassi: IntList, DoubleList, StringList, etcetc

E' questo il senso?

Grazie
Andrea
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Space Pioneer starebbe realizzando un pr...
SpaceX ritirerà ''a breve'' il Fa...
La Luna ha un nuovo cratere di grandi di...
ROG Cronox: ASUS alza l'asticella dei ca...
Lenovo annuncia nuovi sistemi per la vir...
M6 e M5 Ultra, i primi benchmark conferm...
La nuova falla della cybersecurity &egra...
The Blood of Dawnwalker, il sequel potre...
Colpiti i data center Amazon: irrecupera...
Google Wallet, nuova interfaccia in arri...
iPhone Duo, problemi di produzione per i...
Firefox diventa più veloce con PDF e JPE...
WhatsApp, arriva su iOS la nuova scorcia...
Snap presenta Specs: realtà aumentata, c...
SteamOS verso un cambiamento epocale: ar...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:42.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v