Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Zenfone 11 Ultra: il flagship ASUS ritorna a essere un 'padellone'
Recensione Zenfone 11 Ultra: il flagship ASUS ritorna a essere un 'padellone'
Zenfone 11 Ultra ha tantissime qualità interessanti, fra cui potenza da vendere, un display di primissimo livello, un comparto audio potente e prestazioni di connettività fra le migliori della categoria. Manca però dell'esclusività del predecessore, che in un settore composto da "padelloni" si distingueva per le sue dimensioni compatte. Abbiamo provato il nuovo flagship ASUS, e in questa recensione vi raccontiamo com'è andata.
Appian: non solo low code. La missione è l’ottimizzazione dei processi con l'IA
Appian: non solo low code. La missione è l’ottimizzazione dei processi con l'IA
Abbiamo partecipato ad Appian World 2024, evento dedicato a partner e clienti che si è svolto recentemente nei pressi di Washington DC, vicino alla sede storica dell’azienda. Nel festeggiare il 25mo anniversario, Appian ha annunciato diverse novità in ambito intelligenza artificiale
Lenovo ThinkVision 3D 27, la steroscopia senza occhialini
Lenovo ThinkVision 3D 27, la steroscopia senza occhialini
Primo contatto con il monitor Lenovo ThinkVision 3D 27 che grazie a particolari accorgimenti tecnici riesce a ricreare l'illusione della spazialità tridimensionale senza che sia necessario utilizzare occhialini
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-08-2020, 15:13   #1
pepp1995
Junior Member
 
Iscritto dal: Aug 2017
Messaggi: 3
[Java] codice non compila

Obiettivo: avere un array di un certo Tipo ClassePadre MA "riempito" con oggetti di ClassiFiglie diverse.

Ho creato una ClassePadre: Figura in cui non faccio sostanzialmente nulla ed ho definito le varie ClassiDerivate di questa classe .
Ogni ClasseDerivata ha 1 unico metodo che è una stampa.


/*DEFINISCO la CLASSE MADRE*/
public class Figura{


}


/*DEFINISCO le CLASSI FIGLIE*/
class Triangolo extends Figura{

public void disegnaTriangolo()
{
System.out.println("disegno Triangolo");
}

}


class Cerchio extends Figura{

public void disegnaCerchio()
{
System.out.println("disegno cerchio");
}

}

class Quadrato extends Figura{

public void disegnaQuadrato()
{
System.out.println("disegno quadrato");
}

}


Il vettore voglio sia inizializzato, inizializzando " in modo random" i suoi elementi con oggetti delle tre classi figlie .

import java.util.Random; //importo la Classe Random

public class GeneratoreCasualeFigure{

//metodo
public Figura GeneraFigura()
{

Random rand=new Random();
Figura x=null;
switch(rand.nextInt(3))
{
case 0:
x= new Cerchio();
break;
case 1:
x= new Quadrato();
break;
case 2:
x= new Triangolo();
break;
}

return x;
}

}


Fin qui tutto funziona nella mainClass.
A questo punto , vorrei fare una stampa del vettore che "a seconda dell'oggetto\elemento del vettore da stampare, mi chiama il metodo() di stampa di quell'oggetto"
Quindo ho definito una classe: Test

public class Test{

public void stampaVettOggFiglie(Figura[] vet,int n )
{

for(int i=0; i<n; i++)
{
switch(vet[i].getClass().getName() ) //scelgo in base al tipoRefenziato
{
case "Triangolo":
vet[i].disegnaTriangolo();
break;

case "Quadrato":
vet[i].disegnaQuadrato();
break;

case "Cerchio":
vet[i].disegnaCerchio();
break;
}
}
}


public static void main(String[] args)
{
Figura[] A= new Figura[10];

GeneratoreCasualeFigure gen= new GeneratoreCasualeFigure();

for(int i=0; i<10; i++)
A[i] = gen.GeneraFigura();


//STAMPA VETTORE riempito con oggetti di classiFiglie diverse
Test x=new Test();
x.stampaVettOggFiglie(A,3);

}

}


PROBLEMA: ho un errore di compilazione, perché il compilatore cerca i tre metodi: disegnaTriangolo(), disegnaQuadrato() , disegnaCerchio() nella ClassePadre e vede che lì non ci sono.

Tuttavia, mi aspetterei che:
<<visto che "al momento dell'invocazione del metodo: stampaVettOggFiglie() ",gli elementi vet[i] sono stati inizializzati con le reference dei rispettivi oggetti--->
- nel momento in cui faccio : vet[i].disegnaTriangolo(); sto accedendo al metodo: disegnaTriangolo() dell' oggetto vet[i] della classe Triangolo
- nel momento in cui faccio : vet[i].disegnaQuadrato(); sto accedendo al metodo: disegnaQuadrato() dell' oggetto vet[i] della classe Quadrato
- nel momento in cui faccio : vet[i].disegnaCerchio(); sto accedendo al metodo: disegnaCerchio() dell' oggetto vet[i] della classe Cerchio >>
Perché non è così?
pepp1995 è offline   Rispondi citando il messaggio o parte di esso
Old 13-08-2020, 11:24   #2
Lampo89
Member
 
L'Avatar di Lampo89
 
Iscritto dal: Dec 2006
Messaggi: 33
Quote:
Originariamente inviato da pepp1995 Guarda i messaggi
Obiettivo: avere un array di un certo Tipo ClassePadre MA "riempito" con oggetti di ClassiFiglie diverse.

Ho creato una ClassePadre: Figura in cui non faccio sostanzialmente nulla ed ho definito le varie ClassiDerivate di questa classe .
Ogni ClasseDerivata ha 1 unico metodo che è una stampa.


/*DEFINISCO la CLASSE MADRE*/
public class Figura{


}


/*DEFINISCO le CLASSI FIGLIE*/
class Triangolo extends Figura{

public void disegnaTriangolo()
{
System.out.println("disegno Triangolo");
}

}


class Cerchio extends Figura{

public void disegnaCerchio()
{
System.out.println("disegno cerchio");
}

}

class Quadrato extends Figura{

public void disegnaQuadrato()
{
System.out.println("disegno quadrato");
}

}


Il vettore voglio sia inizializzato, inizializzando " in modo random" i suoi elementi con oggetti delle tre classi figlie .

import java.util.Random; //importo la Classe Random

public class GeneratoreCasualeFigure{

//metodo
public Figura GeneraFigura()
{

Random rand=new Random();
Figura x=null;
switch(rand.nextInt(3))
{
case 0:
x= new Cerchio();
break;
case 1:
x= new Quadrato();
break;
case 2:
x= new Triangolo();
break;
}

return x;
}

}


Fin qui tutto funziona nella mainClass.
A questo punto , vorrei fare una stampa del vettore che "a seconda dell'oggetto\elemento del vettore da stampare, mi chiama il metodo() di stampa di quell'oggetto"
Quindo ho definito una classe: Test

public class Test{

public void stampaVettOggFiglie(Figura[] vet,int n )
{

for(int i=0; i<n; i++)
{
switch(vet[i].getClass().getName() ) //scelgo in base al tipoRefenziato
{
case "Triangolo":
vet[i].disegnaTriangolo();
break;

case "Quadrato":
vet[i].disegnaQuadrato();
break;

case "Cerchio":
vet[i].disegnaCerchio();
break;
}
}
}


public static void main(String[] args)
{
Figura[] A= new Figura[10];

GeneratoreCasualeFigure gen= new GeneratoreCasualeFigure();

for(int i=0; i<10; i++)
A[i] = gen.GeneraFigura();


//STAMPA VETTORE riempito con oggetti di classiFiglie diverse
Test x=new Test();
x.stampaVettOggFiglie(A,3);

}

}


PROBLEMA: ho un errore di compilazione, perché il compilatore cerca i tre metodi: disegnaTriangolo(), disegnaQuadrato() , disegnaCerchio() nella ClassePadre e vede che lì non ci sono.

Tuttavia, mi aspetterei che:
<<visto che "al momento dell'invocazione del metodo: stampaVettOggFiglie() ",gli elementi vet[i] sono stati inizializzati con le reference dei rispettivi oggetti--->
- nel momento in cui faccio : vet[i].disegnaTriangolo(); sto accedendo al metodo: disegnaTriangolo() dell' oggetto vet[i] della classe Triangolo
- nel momento in cui faccio : vet[i].disegnaQuadrato(); sto accedendo al metodo: disegnaQuadrato() dell' oggetto vet[i] della classe Quadrato
- nel momento in cui faccio : vet[i].disegnaCerchio(); sto accedendo al metodo: disegnaCerchio() dell' oggetto vet[i] della classe Cerchio >>
Perché non è così?
Ciao,
vet[i] è una reference a Figure, di conseguenza potrai invocare i soli metodi che costituiscono l'interfaccia di Figure.
Stai confondendo due concetti: un conto è il tipo concreto dell'oggetto che è referenziato - che può essere uno tra un triangolo, un cerchio e un quadrato - un'altra cosa è il tipo della referenza che punta ad esso e che definisce "ciò che puoi utilizzare".
Nel tuo caso devi eseguire un cast esplicito nella opportuna classe figlia, ad es:

case "Triangolo":
((Triangolo)vet[i]).disegnaTriangolo();
break;

o ancora meglio sfruttare in maniera più efficace interfacce e polimorfismo, per es (mantenendo quasi tutti i vecchi nomi):

/*DEFINISCO la CLASSE MADRE*/
public interface Figura {
void disegna();
}

/*DEFINISCO le CLASSI FIGLIE*/
class Triangolo implements Figura {
@Override
public void disegna() {
System.out.println("disegno Triangolo");
}
}

class Cerchio implements Figura { // TODO
}

class Quadrato implements Figura { // TODO
}

// test
public class Test {
private static final int SIZE = 10;

public static void stampaVettOggFiglie(Figura[] vet) {
for (Figura f : vet) {
f.disegna();
}
}

public static void main(String[] args) {
final Figura[] A = new Figura[SIZE];
final GeneratoreCasualeFigure gen = new GeneratoreCasualeFigure();

for (int i = 0; i < SIZE; i++) {
A[i] = gen.GeneraFigura();
}

//STAMPA VETTORE riempito con oggetti di classiFiglie diverse
stampaVettOggFiglie(A);
}

}

Ultima modifica di Lampo89 : 13-08-2020 alle 11:26.
Lampo89 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Zenfone 11 Ultra: il flagship ASUS ritorna a essere un 'padellone' Recensione Zenfone 11 Ultra: il flagship ASUS ri...
Appian: non solo low code. La missione è l’ottimizzazione dei processi con l'IA Appian: non solo low code. La missione è ...
Lenovo ThinkVision 3D 27, la steroscopia senza occhialini Lenovo ThinkVision 3D 27, la steroscopia senza o...
La Formula E può correre su un tracciato vero? Reportage da Misano con Jaguar TCS Racing La Formula E può correre su un tracciato ...
Lenovo LEGION e LOQ: due notebook diversi, stessa anima gaming Lenovo LEGION e LOQ: due notebook diversi, stess...
Sta per succedere! La prima gara a guida...
Parthenope: un nuovo RPG investigativo t...
Urbanista Malibu: ecco come va la cassa ...
Gas Station Simulator è costato 1...
AOC Graphic Pro U3, tre nuovi monitor pe...
Wacom Movink: per la prima volta il disp...
HPE Aruba presenta i nuovi access point ...
Lamborghini presenta Urus SE, prima vers...
Scuderia Ferrari e HP insieme: ufficiale...
Snapdragon X Plus, un nuovo SoC per i no...
L'iPad 10,9'' 64 GB è sceso a meno di 40...
Steam: basta ai furbetti dell'accesso an...
Motorola Edge 40 Neo con fotocamera da 5...
Arriva Kasperksy Next, la nuova gamma di...
Fallout, un successo senza fine: 1 milio...
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: 01:38.


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