Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a
Abbiamo potuto mettere le mani in anteprima sul nuovo monitor MSI dedicato ai giocatori: un mostro che adotta un pannello QD-OLED da 26,5 pollici con risoluzione 2560 x 1440 pixel, frequenza di aggiornamento fino a 500 Hz e tempo di risposta di 0,03 ms GtG
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro
DJI aggiorna la sua linea di droni ultraleggeri con Neo 2, un quadricottero da 160 grammi che mantiene la compattezza del predecessore ma introduce una stabilizzazione meccanica a due assi, sensori omnidirezionali e un sistema LiDAR
L'IA "seria" di Appian è diversa: inserita nei processi e rispetta dati e persone
L'IA "seria" di Appian è diversa: inserita nei processi e rispetta dati e persone
Ad Appian Europe 2025, l'azienda parla molto della sua visione di cos'è e come dovrebbe essere usata l'intelligenza artificiale: è uno strumento che va sempre adoperato dalle persone, che devono rimanere responsabili dei processi all'interno dell'azienda. Non è un giocattolo con cui sperimentare, ma un aiuto per superare le sfide di business più importanti
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-05-2009, 17:21   #1
D4rkAng3l
Bannato
 
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
[JAVA] Esempio di classe Abstract...ma così non è una porcata?!?!

Ciao,
stavo vedendo un esempio di classe Abstract sul mio libro...ma sinceramente mi pare un po' una porcata come viene usata in questo caso...mi dite se oggettivamente sono cose da evitare o se invece non ho capito bene io?

Praticamente ho una classe astratta IntSet che mi fornisce una rappresentazione parziale di un insieme di interi e l'unica variabile di istanza è la variabile protected dimensione che indica la dimensione di tale insieme di interi.

Poi estendo tale classe abstract mediante la sottoclasse SortedIntSet che rappresenta un insieme di interi ordinati e che usa come variabile di istanza una OrderedIntList (una classe che mi rappresenta liste di interi ordinate).
In tale sottoclasse viene fornita la rappresentazione vera e propria del tipo di dati (che nella classe astratta non veniva fornita perchè poi magari potrei avere altre estensioni di IntSet che la implementano in altro modo...tipo ad esempio un'altra sottoclasse ConstantIntSet che rappresenta insiemi di interi di dimensione costante).

La variabile di istanza dimensione della superclasse è stata definita protected così quando ad esempio aggiungo con il metodo insert() o rimuovo con delete() un elemnto ad OrderedIntList posso accedere alla variabile protected dimensione ed aggiornarla.
Ma francamente mi pare un po' una porcata dichiarare tale variabile protected per 2 motivi:

1) Se cambio l'implementazione della superclasse devo cambiare l'implementazione delle varie sottoclassi.
2) Motivi di sicurezza perchè è visibile in tutto il package e qualsiasi metodo definito nel package potrebbe andare a modificarla.

Che mi dite in proposito? C'ho ragione io o mi sfugge qualcosa?

Il codice d'esempio del libro (parzialmente implementato) è il seguente:

Codice:
public abstract class IntSet{
	
	protected int dimensione;			// La dimensione
	
	// COSTRUTTORE
	public IntSet(){
		dimensione = 0;
	}
	
	// METODI ABSTRACT
	public abstract void insert(int x);		// Inserisce l'elemento x nell'insieme di interi
	public abstract void remove(int x);		// Rimuove l'elemento x dall'insieme di interi
	public abstract Iterator elements();	// Per enumerare gli elementi dell'insieme di interi
	
	
	// METODI IMPLEMENTATI
	public boolean isIn(int x){
		Iterator g = elements();
		Integer z = new Integer(x);
		
		while(g.hasNext())
			if(g.next().equals(z)) return true;
		return false;
	}
	
	public int size(){
		return dimensione;
	}
	
	// IMPLEMENTAZIONE DEI METODI subset() e toString()
}
Codice:
public class SortedIntSet extends Inset{
	
	private OrderedIntList els;
	
	public SortedIntSet(){			// COSTRUTTORE
		els = new OrderedIntList();
	}
	
	public int max() throws EmptyException{
		if(dimensione == 0) throw new EmptyException("SortedIntSet.max");
		return els.greates();
	}
	
	public Iterator elements(){
		return els.elements();
	}
	
	public boolean subset((SortdIntSet) s){
		try{
			return subset((SortedIntSet) s);
		}catch(ClassCastException e){return super.subset(s);}
	}
	
	public boolean subset(SortedIntSet s){
		.....
		.....
		.....
	}
	
	// Implementazione di insert e remove va quì
}
Poi ho qualche domanda teorica:

1) Estendendo IntSet la variabile protected dimensione viene ereditata in SortedIntSet...se si...perchè allora devo dichiararla protected per potervi accedere dalla classe figlia? Se era dichiarata private e viene ereditata perchè non ci si accede automaticamente?

2) Il costruttore della classe abstract IntSet non viene mai invocato dagli utenti ma da quello che ho letto sul libro i costruttori delle classi abstract vengono invocati dai costruttori delle classi che le estendono per inizializzare la parte comune di rappresentazione, giusto?
Allora quì (nel costruttore di SortedIntSet):

Codice:
public SortedIntSet(){			// COSTRUTTORE
		els = new OrderedIntList();
	}
dove cavolo viene invocato il costruttore della classe padre IntSet? Lo fà in automatico senza dover specificarlo? potevo anche metterci dentro super()?

3) Avrei potuto non usare la classe padre abstract (IntSet) ed al posto di questa usare un'interface IntSet senza NESSUNA RAPPRESENTAZIONE (la variabile dimensione) ed implementare vari sottotipi di IntSet tra cui ad esempio il SortedIntSet visto prima ed un ConstantIntSet ognuno con una sua propria rappresentazione e l'implementazione di tutti i metodi abstract definiti dentro l'interface IntSet, avrebbe avuto più senso o no?

4) [DOMANDA FORSE DELIRANTE] Se proprio avessi voluto usare la classe abstract come ha fatto lui nell'esempio del codice, a questo punto non sarebbe stato meglio dichiarare private la variabile di istanza dimensione (nella classe abstract) e poi prevedere in tale classe un metodo abstract che mi faceva accedere a tale variabile (così tale metodo era visibile anche nelle classi figlie)...cambiava qualcosa o no?

Grazie
Andrea
D4rkAng3l è offline   Rispondi citando il messaggio o parte di esso
Old 16-05-2009, 20:31   #2
Energy++
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 1059
Quote:
Originariamente inviato da D4rkAng3l Guarda i messaggi
Ciao,
stavo vedendo un esempio di classe Abstract sul mio libro...ma sinceramente mi pare un po' una porcata come viene usata in questo caso...mi dite se oggettivamente sono cose da evitare o se invece non ho capito bene io?

Praticamente ho una classe astratta IntSet che mi fornisce una rappresentazione parziale di un insieme di interi e l'unica variabile di istanza è la variabile protected dimensione che indica la dimensione di tale insieme di interi.

Poi estendo tale classe abstract mediante la sottoclasse SortedIntSet che rappresenta un insieme di interi ordinati e che usa come variabile di istanza una OrderedIntList (una classe che mi rappresenta liste di interi ordinate).
In tale sottoclasse viene fornita la rappresentazione vera e propria del tipo di dati (che nella classe astratta non veniva fornita perchè poi magari potrei avere altre estensioni di IntSet che la implementano in altro modo...tipo ad esempio un'altra sottoclasse ConstantIntSet che rappresenta insiemi di interi di dimensione costante).

La variabile di istanza dimensione della superclasse è stata definita protected così quando ad esempio aggiungo con il metodo insert() o rimuovo con delete() un elemnto ad OrderedIntList posso accedere alla variabile protected dimensione ed aggiornarla.
Ma francamente mi pare un po' una porcata dichiarare tale variabile protected per 2 motivi:

1) Se cambio l'implementazione della superclasse devo cambiare l'implementazione delle varie sottoclassi.
2) Motivi di sicurezza perchè è visibile in tutto il package e qualsiasi metodo definito nel package potrebbe andare a modificarla.

Che mi dite in proposito? C'ho ragione io o mi sfugge qualcosa?
si, credo sarebbe stato meglio dichiarare la variabile come private e poi creare dei metodi di accesso e modifica (set, get)

Quote:

Il codice d'esempio del libro (parzialmente implementato) è il seguente:

Codice:
cut..
Codice:
cut..
Poi ho qualche domanda teorica:

1) Estendendo IntSet la variabile protected dimensione viene ereditata in SortedIntSet...se si...perchè allora devo dichiararla protected per potervi accedere dalla classe figlia? Se era dichiarata private e viene ereditata perchè non ci si accede automaticamente?
le variabili e i metodi dichiarati private non hanno visibilità fuori dalla classe di appartenenza:

Accesso privato: si può accedere solo dall’ambito della stessa classe
Accesso pubblico: Completamente disponibile per qualsiasi altra classe che voglia farne uso
Accesso protetto: visibile dalle sottoclassi e nello stesso package
Accesso di default: visibile nello stesso package

Quote:
2) Il costruttore della classe abstract IntSet non viene mai invocato dagli utenti ma da quello che ho letto sul libro i costruttori delle classi abstract vengono invocati dai costruttori delle classi che le estendono per inizializzare la parte comune di rappresentazione, giusto?
Allora quì (nel costruttore di SortedIntSet):

Codice:
public SortedIntSet(){			// COSTRUTTORE
		els = new OrderedIntList();
	}
dove cavolo viene invocato il costruttore della classe padre IntSet? Lo fà in automatico senza dover specificarlo? potevo anche metterci dentro super()?
la classe IntSet ha un costruttore senza parametri che viene richiamato in modo implicito dai costruttori delle varie classi derivate. In caso di un costruttore con parametri, la sua invocazione deve essere invece esplicita con super()
Energy++ è offline   Rispondi citando il messaggio o parte di esso
Old 16-05-2009, 22:21   #3
Dimension7
Senior Member
 
L'Avatar di Dimension7
 
Iscritto dal: Aug 2007
Città: Viterbo
Messaggi: 2559
Ti è stato già risposto, comunque aggiungo alcune precisazioni:

2)Come dice Energy++ il costruttore viene richiamato implicitamente nei costruttori delle classi derivate: per essere più precisi, questo valer per ogni classe derivata, a prescindere dal fatto che la classe padre sia abstract o meno. Se non ci scrivi niente, il costruttore della classe derivata si comporta come se nella prima riga avesse "super()", se vuoi usare un costruttore diverso da quello a zero argomenti puoi farlo ma dev'essere sempre la prima istruzione del costruttore.

3)Dipende sempre da ciò che ti serve: la classe astratta in genere serve quando si ritiene che alcuni metodi saranno uguali per tutte le classi derivate, mentre altri saranno in comune, quindi saranno dichiarati nella classe astratta. Invece l'interfaccia da un'idea un po' più generica delle funzioni, tra virgolette potremmo dire che sono tutte astratte...
Altra caratteristica è che per usare le classi astratte devi ereditarle (o estenderle, se preferisci dire così), mentre le interfacce si implementano: in Java si può ereditare solo da una classe, ma si posso implementare più interfacce.

4)Come facevi a mettere un metodo abstract che si riferiva alla variabile privata? Essendo abstract non ha corpo, quindi non sai come usarlo, devi implementarlo nella classe figlia... non penso funzionerebbe.
Ora non ricordo precisamente, comunque si usa protected per le classi che dovranno essere derivate per un fatto di semplicità, per usare una variabile private nella classe abstract poi avresti dovuto prevedere un metodo getter concreto nella classe stessa. Ma comunque una variabile protected può essere vista solo nello stesso package, quindi si può optare per la creazione di un package piccolissimo, magari costituito solo dalla classe in questione, ed ecco che la variabile sarà accessibile solo a chi eredita dalla classe.
__________________
Coolermaster Centurion 590 - Asus M4A78PRO - Phenom II 720 - HIS 6950 IceQ X Turbo 2GB - 2x2 Gb Corsair XMMS2 - Crucial MX300 500gb - HD WD 500gb - Asus VW246H - Windows 7 Pro 64bit
Dimension7 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI C...
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro DJI Neo 2 in prova: il drone da 160 grammi guada...
L'IA "seria" di Appian è diversa: inserita nei processi e rispetta dati e persone L'IA "seria" di Appian è divers...
Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Stanco dei browser pieni di AI? Orion pe...
GeForce RTX 5000 custom in pericolo? NVI...
Windows Update prende il posto di Micros...
Segnali di crisi per il mercato Smart TV...
Lenovo LEGION e LOQ con NVIDIA GeForce R...
Nuova Fiat 500 ibrida al debutto. Elkann...
Ecco il primo PC da gaming basato su una...
Grok può battere i campioni di Le...
DEEBOT T50 Max Pro Gen2 e X2 Omni ai min...
Autoflight mostra il primo vertiporto ga...
TCL QD-Mini LED e QLED da 65'' crollano ...
Black Friday portatili gaming: Acer Nitr...
Nuova rimodulazione per WindTre: dal 10 ...
Plex ti farà pagare per lo stream...
Adesso è ufficiale: in UK EV e plug-in p...
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: 17:50.


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