Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HUAWEI Pura 70 Ultra: il cameraphone è di nuovo tra noi con un ma! Recensione 
HUAWEI Pura 70 Ultra: il cameraphone è di nuovo tra noi con un ma! Recensione 
HUAWEI continua a marciare sul mondo mobile cercando di fare un po’ tutto in casa propria dopo il ban USA e la perdita dei servizi di Google e altro. Il risultato più importante è senza dubbio questo HUAWEI Pura 70 Ultra, un camera phone dalle prestazioni incredibili che rimette in gioco l’azienda grazie anche ai servizi di Google più facilmente installabili.   
Edge 50 Ultra: Motorola convince anche con il suo top di gamma! La recensione
Edge 50 Ultra: Motorola convince anche con il suo top di gamma! La recensione
Motorola sfida i top di gamma con funzionalità AI avanzate, design innovativo e prestazioni da vero flagship. Riuscirà a trovare spazio anche nel segmento premium di mercato? Tutti i dettagli, test e prezzo di questo nuovo smartphone.
FlexiSpot E7B-PRO: una scrivania motorizzata per migliorare la postura
FlexiSpot E7B-PRO: una scrivania motorizzata per migliorare la postura
Abbiamo ricevuto e provato la scrivania FlexiSpot E7B-PRO. Dotata di gambe motorizzate, è una scrivania di nuova generazione regolabile in altezza, perfetta sia per le attività professionali che per l'intrattenimento.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-11-2003, 09:57   #41
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3612
mi sa che ci vorrebbe un bell'esempio

tu hai provato ad implementarne qualcuna ?
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2003, 13:14   #42
PGI
Bannato
 
L'Avatar di PGI
 
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
L'uso di una delle interfacce esistenti nelle librerie Java è praticamente inevitabile (basta pensare ad ActionListener nelle applicazioni grafiche). Anche in applicazione a consolle è piuttosto facile imbattersi in una delle interfacce esistenti (a meno di non limitarsi a scrivere "Hello world" e altre amenità).

Con le interfacce puoi generare strutture gerarchiche piuttosto articolate. L'esempio che segue è un caso di "polimorfismo estremo": un oggetto che "è" di 4 tipi diversi (usando le sole interfacce, con l'ereditarietà di classe la cosa può complicarsi anche di più).

La prima interfaccia definisce due costanti e un metodo astratto. Tutti i campi di un interfaccia sono per definizione "public static final".
Codice:
public interface Nominabile {
	String NOMINABILE="ha un nome";
	String INNOMINABILE="ha un nome ma non puo' dirlo";
	
	public String getNominabile();
}
Seconda interfaccia, altre due costanti ed un metodo:
Codice:
public interface Tipo {
	String TIPO_1="oggetto di tipo 1";
	String TIPO_2="oggetto di tipo 2";
	
	public String getTipo();
}
Terza interfaccia, figlia di Nominabile e di Tipo (ereditarietà multipla, supportata solo dalle interfacce):
Codice:
public interface TipoNominabile extends Tipo, Nominabile {
	public String getCombinazione();
}
Oggetto che implementa l'interfaccia "TipoNominabile":
Codice:
public class UnOggetto implements TipoNominabile {
	public String getTipo() {
		return TIPO_1;
	}
	
	public String getNominabile() {
		return INNOMINABILE;	
	}	
	
	public String getCombinazione() {
		return TIPO_1+" "+INNOMINABILE;
	}
	
	public String toString() {
		return "un oggetto";	
	}
		
}
Codice che mostra come l'ereditarietà multipla interagisce con il polimorfismo dei riferimenti:
Codice:
class Application {

	Application() {
		UnOggetto o=new UnOggetto();
		stampaUnOggetto(o);
		stampaNominabile(o);
		stampaTipo(o);
		stampaTipoNominabile(o);		
	}
	
	public void stampaNominabile(Nominabile n) {
		System.out.println(n.getNominabile());	
	}
	
	public void stampaTipo(Tipo t) {
		System.out.println(t.getTipo());	
	}
	
	public void stampaTipoNominabile(TipoNominabile tn) {
		System.out.println(tn.getCombinazione());	
	}
	
	public void stampaUnOggetto(UnOggetto o) {
		System.out.println(o);	
	}
		

	public static void main(String[] args) {
		new Application();
	}
}


A titolo di curiosità, quando passi ad un metodo un riferimento di tipo interfaccia in realtà non passi un'istanza dell'interfaccia ma di un oggetto che implementa l'interfaccia.
Una cosa simile capita quando in un metodo definisci una variabile di tipo interfaccia:
...corpo di un metodo
Interfaccia interf=new Interfaccia() {
//implementazione dei metodi astratti...
}
metodo(interf);

Per farla breve, "new Interfaccia()" è una scorciatoia: in esecuzione quello che accade è che la jvm crea un oggetto che implementa l'interfaccia usando la definizione dei metodi che hai fornito nella classe astratta.
PGI è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2003, 17:39   #43
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3612
scusa ma entro un attimo nell'argomento delle classi astratte in quanto se non ho capito male, le interfacce altro non sono che surrogati di classi astratte

abbiamo

Codice:
A _________
|          |
B         C
A=superclasse
B e C = sottoclassi che condividono qualcosa con A ma non tra loro

come mai nella superclasse A devono comparire, sotto forma di dichiarazioni abstract, i metodi implementati in B e C ?

forse sono una sorta di segnalatore che evitano alla JVM di cercare in A ciò che non troverebbero e dicono sempre alla JVM di cercare direttamente attraverso il riferimento comune nella classe istanziata alla quale punta il riferimento ?

spero di essere stato chiaro

Ultima modifica di misterx : 23-11-2003 alle 08:37.
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 23-11-2003, 02:53   #44
PGI
Bannato
 
L'Avatar di PGI
 
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
La risposta potrebbe essere "ni" ad entrambe le questioni.

Per certi aspetti è vero che le interfacce sono versioni "minori" delle classi astratte (perchè una classe astratta può avere metodi con un corpo mentre un'interfaccia no)

Per la seconda domanda, non è del tutto esatto dire che una superclasse debba avere dei metodi astratti: l'uso del modificatore abstract ha uno scopo ulteriore rispetto alla semplice ereditarietà ed in particolare costringe ogni sottoclasse che non sia a sua volta "abstract" ad avere una propria definizione del corpo del metodo.

Hai però toccato (volontariamente o meno ) un argomento su cui ho qualche perplessità (e che stò approfondendo) e che riguarda indirettamente il supporto Java al binding statico e dinamico: personalmente credo che Java supporti entrambe i tipi di "collegamento" ma, come si usa dire, al momento non ne ho la prova...tra qualche centinaia di pagine web ti saprò dire con più precisione.

Mi "riservo" spiegazioni ulteriori in futuro

Ultima modifica di PGI : 23-11-2003 alle 03:17.
PGI è offline   Rispondi citando il messaggio o parte di esso
Old 23-11-2003, 14:37   #45
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3612
io di dubbi ne ho anche di più, più proseguo e più ne colleziono

stavo leggendo QUI

dove è presente la costruzione step by step di alcune classi astratte/concrete

peccato che l'autore non dice cosa accadrebbe se le superclassi non le dichiara abstract

posso lavorare con le soli classi concrete allo stesso modo di quelle astratte ?

se lavoro con tutte classi concrete perdo l'ereditarietà ?
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 23-11-2003, 15:23   #46
PGI
Bannato
 
L'Avatar di PGI
 
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
Dal punto di vista dell'ereditarietà non c'è differenza tra classi astratte e non astratte.

Quello che cambia è che non si può creare un nuovo oggetto a partire da un modello di classe astratta.

es.

abstract class ClasseAstratta{...}

ClasseAstratta a=new ClasseAstratta() <- errore (in compilazione)

Il motivo dipende da come la jvm inizializza gli oggetti: l'operatore "new" comporta la "creazione" di tutti i metodi e campi dichiarati in una classe. Poichè le classi astratte hanno alcuni metodi senza corpo l'operazione non è ammessa.

In pratica puoi sicuramente lavorare con classi "normali" come faresti con classi astratte, ma non puoi usare le classi astratte come faresti con quelle normali.

E allora che cavolo se ne fa uno delle classi astratte?
Una classe astratta può essere necessaria quando nella fase di progettazione scopri che avrai bisogno di un riferimento polimorfico "esclusivamente dinamico". Noterai che di solito gli esempi che trovi sull'argomento sono piuttosto simili:

superclasse astratta che indica un genere (veicolo, animale o mammifero ecc... la fantasia abbonda ) e sottoclassi che definiscono un tipo del genere (auto, moto, cane gatto ecc...).

la classe che indica il genere è usata proprio per esemplificare la necessità (o l'utilità) di un riferimento "generico" che può assumere in concreto svariate forme (una per tipo).
PGI è offline   Rispondi citando il messaggio o parte di esso
Old 23-11-2003, 15:53   #47
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3612
Quote:
Originariamente inviato da PGI

Una classe astratta può essere necessaria quando nella fase di progettazione scopri che avrai bisogno di un riferimento polimorfico "esclusivamente dinamico".

cioè se la classe non è astratta non può esistere il polimorfismo ?
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 23-11-2003, 19:09   #48
PGI
Bannato
 
L'Avatar di PGI
 
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
Quote:
Originariamente inviato da misterx
cioè se la classe non è astratta non può esistere il polimorfismo ?
Nain! Il polimorfismo in sè dipende dall'ereditarietà (che coinvolge le classi in genere, astratte o meno).

Facciamo un esempio:

abstrac class ClassA {
abstract void doSome();
}

class Child extends ClassA {
void doSome{
System.out.println("Ciao");
}
}

riferimento polimorfico:

ClassA pointer;
Child child=new Child();
pointer=child;
pointer.doSome() <- questo doSome() non è mai quello della classe-tipo usata per il puntatore, il suo contenuto dipende sempre dalla classe a cui appartiene l'oggetto puntato.

Con classi "comuni":

class Parent {
public void doSome() {
System.out.println("Ciao");
}
}

class Child extends Parent {
}

Parent pointer;
Child child=new Child();
pointer=child;
pointer.doSome(); <- questo metodo è quello del tipo usato per il puntatore (cioè la classe genitore) a meno che la sotto-classe non lo ridefinisca.
PGI è offline   Rispondi citando il messaggio o parte di esso
Old 23-11-2003, 19:25   #49
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3612
stai diventato sempre più complicato

ascolta, propongo di tenerci il codice sotto per ragionare sulle classi astratte, concrete ed interfacce: che ne dici ?

nel frattempo mi manda in output null


Codice:
class Negoziante {
 public String insegna;
 public String getInsegna() {
  return insegna;
 }
}

class Pizzeria extends Negoziante {
 public String Pizzeria() {  
 	return "Pizzeria";
 }
}

class Ristorante extends Negoziante {
 public String Ristorante() {
 	return "Ristorante";
 }
}

:D:D:D

class Pgi { 

public static void main (String[] args) {

    Negoziante n = new Pizzeria();
   
    System.out.println(n.getInsegna());
    
System.out.println("ciao");

}
}
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2003, 00:48   #50
PGI
Bannato
 
L'Avatar di PGI
 
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
Di che ti taglierei le dita

Negoziante n=new Pizzeria(): ok

System.out.println(n.getInsegna()): ok, ma qual'è il metodo "getInsegna()" che viene chiamato?

Poichè la sottoclasse Pizzeria non sovrascrive quello della superclasse è il metodo "getInsegna()" di Negoziante.

E va benissimo. Ora dobbiamo guardare quello che fa il metodo "getInsegna()" di Negoziante: restituisce la stringa "insegna".

Passiamo allora al campo "insegna" di Negoziante: è ereditato da Pizzeria? Si. Pizzeria definisce un valore per "insegna" (cioè pizzeria sovrascrive il campo o richiama un metodo che influenza il valore del campo) ? No.

Allora che valore ha "insegna" nell'oggetto di tipo Pizzeria? Ha il valore "originale", definito dalla superclasse Negoziante.

E il suo valore è null (insegna è un campo non inizializzato, in java punta automaticamente a "null" se è un oggetto) -> risolto il mistero.

Prima di passare a classi astratte e interfacce è meglio maneggiare un po' le classi "normali" (sbagliando si impara moltissimo, ma è meglio sbagliare una cosa alla volta).

Codice:
class Pizzeria extends Negoziante {
 public String Pizzeria() {  
 	return "Pizzeria";
 }
}
Cosa c'è che non va qui: in questo caso "Pizzeria()" non è il costruttore della classe. A scanso di equivoci, un costruttore non è un metodo con lo stesso nome della classe ma è un metodo che oltre ad avere lo stesso nome della classe non ha un tipo restituito (nè void nè primitivi nè oggetti). Quindi Pizzeria è una sottoclasse di Negoziante che definisce un metodo "Pizzeria()" che, se chiamato, restituisce una stringa con la parola "Pizzeria".
E ha poco a che vedere con lo scopo delle classi (ereditarietà e polimorfismo).

Il risultato presumibile si ottiene invece dando a Pizzeria un costruttore che sovrascriva il campo "insegna" così:

Codice:
class Pizzeria extends Negoziante {
 Pizzeria() {
  insegna="Pizzeria";
 }
}
Dovresti provare a fare qualche esercizio sull'ereditarietà creando qualche gerarchia di classi.

Siccome il thread assomiglia sempre di più ad una chat, che a me va benissimo, ma agli amministratori del forum un po' meno (per ottime ragioni tuttavia), ti mando in pvt la mia e-mail .

&Ciao.
PGI è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2003, 07:56   #51
a2000
Bannato
 
L'Avatar di a2000
 
Iscritto dal: Jan 2001
Messaggi: 1976
misterx quand'è che la smetterai di metterti a culo busone ?
a2000 è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2003, 07:59   #52
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3612
Quote:
Originariamente inviato da a2000
misterx quand'è che la smetterai di metterti a culo busone ?


uhm, sarai mica amante esclusivo del fai da te e = (super orgoglioso) eh ???

aho, mi faccio solo da me

lasiammo stare va, che entrerei in un argomento un pò troppo spinoso

Ultima modifica di misterx : 24-11-2003 alle 08:15.
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2003, 08:22   #53
a2000
Bannato
 
L'Avatar di a2000
 
Iscritto dal: Jan 2001
Messaggi: 1976
"uhm" , probabilmente credo nelle tue capacità più di quanto ci creda tu stesso ...

forse sei pigro ...

ti devi solo applicare ...
a2000 è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2003, 08:37   #54
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3612
Quote:
Originariamente inviato da a2000
"uhm" , probabilmente credo nelle tue capacità più di quanto ci creda tu stesso ...

forse sei pigro ...

ti devi solo applicare ...


pigro non molto, arrugginito parecchio

cmq, è risaputo che è più facile imparare java per chi non conosce alcun linguaggio di programmazione

per chi come me che conosce già un linguaggio imperativo come il C si trova in una posizione leggermente sfavorevole; java è molto astratto, il C lo è molto meno

ma sto rimediando grazie anche alla pazienza degli utenti di questo forum

l'importante è tenere duro

Ultima modifica di misterx : 24-11-2003 alle 09:28.
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2003, 09:07   #55
a2000
Bannato
 
L'Avatar di a2000
 
Iscritto dal: Jan 2001
Messaggi: 1976
nei post, come nella vita, conta solo l'inizio e la fine:

Quote:
Originariamente inviato da misterx
pigro non molto, arrugginito parecchio
....
l'importante è tenere duro
vai tranquillo l'uccello non si arrugginisce mai !
a2000 è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2003, 09:26   #56
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3612
Quote:
Originariamente inviato da a2000
nei post, come nella vita, conta solo l'inizio e la fine:


vai tranquillo l'uccello non si arrugginisce mai !


cmq, so cosa intendi
misterx è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2003, 09:45   #57
a2000
Bannato
 
L'Avatar di a2000
 
Iscritto dal: Jan 2001
Messaggi: 1976
sono entrambi organi cavernosi !

e con funzioni intercambiabili a seconda dell'oggetto su cui vengono applicati !


POLIMORFISMO = La capacita' di ottenere comportamento specializzato, invocando un servizio generico, attraverso le informazioni sul tipo dell'oggetto al quale si richiede il servizio, che possono essere ottenute staticamente (static-binding), oppure dinamicamente (late-binding).
a2000 è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2003, 09:49   #58
a2000
Bannato
 
L'Avatar di a2000
 
Iscritto dal: Jan 2001
Messaggi: 1976
vedi misterx bisogna avere un approccio funning alla conoscenza:

se la gente ragionasse con l'uccello e scopasse con la testa (non in senso figurato) il mondo probabilmente andrebbe meglio.

se non altro ci sarebbero molti meno calvi in giro !!!!

a2000 è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2003, 09:53   #59
a2000
Bannato
 
L'Avatar di a2000
 
Iscritto dal: Jan 2001
Messaggi: 1976
devo approfondirlo sto' concetto di polimorfismo ...

ma un uso polimorfo (nel senso suddetto) degli oggetti non confligge con l'ereditarietà ????
a2000 è offline   Rispondi citando il messaggio o parte di esso
Old 24-11-2003, 10:04   #60
misterx
Senior Member
 
Iscritto dal: Apr 2001
Città: Milano
Messaggi: 3612
Quote:
Originariamente inviato da a2000
devo approfondirlo sto' concetto di polimorfismo ...

ma un uso polimorfo (nel senso suddetto) degli oggetti non confligge con l'ereditarietà ????

ti stai dando la zappa zui piedi ??
misterx è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HUAWEI Pura 70 Ultra: il cameraphone è di nuovo tra noi con un ma! Recensione  HUAWEI Pura 70 Ultra: il cameraphone è di...
Edge 50 Ultra: Motorola convince anche con il suo top di gamma! La recensione Edge 50 Ultra: Motorola convince anche con il su...
FlexiSpot E7B-PRO: una scrivania motorizzata per migliorare la postura FlexiSpot E7B-PRO: una scrivania motorizzata per...
Citroën ë-C3, la prova in anteprima: l'elettrica con caratteristiche e prezzo per tutti Citroën ë-C3, la prova in anteprima: l...
Intel Lunar Lake: le nuove CPU per i notebook del 2024 Intel Lunar Lake: le nuove CPU per i notebook de...
Chang'e-6: completato il trasferimento d...
Ariane 6: il lancio inaugurale del razzo...
Apple annuncia i vincitori dei Apple Des...
Synology al Computex 2024: molte novit&a...
La capsula Boeing CST-100 Starliner ha e...
La California vuole imporre un kill swit...
Twitch: il TAR Lazio accoglie il ricorso...
Seasonic e Noctua per un alimentatore da...
Sì, HTC presenterà un nuov...
HYTE: innovazione, semplificazione e col...
I monitor gaming MSI QD-OLED al Computex...
ASUS mostra al Computex i router WiFi 7 ...
Nothing conferma il debutto del nuovo sm...
World of Warcraft, la beta dell'espansio...
Fotografia mobile come priorità 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: 20:53.


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