Torna indietro   Hardware Upgrade Forum > Software > Programmazione

GeForce RTX 3090 in test, Nvidia Ampere all'ennesima potenza
GeForce RTX 3090 in test, Nvidia Ampere all'ennesima potenza
GeForce RTX 3090 Founders Edition è la scheda video al top di gamma della nuova offerta Ampere di Nvidia. Equipaggiata con una GPU ancora più potente di quella del modello GeForce RTX 3080 e con ben 24 GB di memoria GDDR6X, RTX 3090 non solo è la scheda video gaming più veloce al mondo ma anche un ottimo prodotto per i content creator.
Canon EOS C70: la cinepresa digitale 4K mirrorless RF
Canon EOS C70: la cinepresa digitale 4K mirrorless RF
Canon EOS C70 porta l'innesto mirrorless RF di EOS R sulla serie Cinema EOS e si presenta come la cinepresa digitale più leggera in casa Canon. Punto di forza il sensore CMOS 4K Super 35mm con DGO (Dual Gain Output), assieme al sistema autofocus Dual Pixel CMOS AF. Una videocamera pronta all'uso professionale sul campo, grazie alle numerose porte, che non richiedono accessori di espansione
POCO X3 NFC: tanto a poco prezzo. Un altro best buy? La recensione
POCO X3 NFC: tanto a poco prezzo. Un altro best buy? La recensione
POCO è tornata con forza e dopo aver immesso sul mercato il nuovo POCO F2 Pro dalle specifiche tecniche esagerate per il prezzo di vendita ecco che propone per la prima volta un device di fascia media che sembra voler divenire un nuovo best buy. Ma sarà davvero così? Ecco la nostra recensione.
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
Junior Member
 
L'Avatar di Lampo89
 
Iscritto dal: Dec 2006
Messaggi: 13
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 è online   Rispondi citando il messaggio o parte di esso
 Rispondi


GeForce RTX 3090 in test, Nvidia Ampere all'ennesima potenza GeForce RTX 3090 in test, Nvidia Ampere all'enne...
Canon EOS C70: la cinepresa digitale 4K mirrorless RF Canon EOS C70: la cinepresa digitale 4K mirrorle...
POCO X3 NFC: tanto a poco prezzo. Un altro best buy? La recensione POCO X3 NFC: tanto a poco prezzo. Un altro best ...
BenQ SW321C: il monitor per chi stampa fotografie BenQ SW321C: il monitor per chi stampa fotografi...
ASUS VivoBook S15 M533IA: tutto al meglio, tranne lo schermo ASUS VivoBook S15 M533IA: tutto al meglio, trann...
Android 11: quali smartphone si aggiorne...
LG K42 e K52 ufficiali: prezzi e specifi...
The Game Awards 2020: ecco la data della...
WhatsApp, anche foto e video si 'distrug...
Nuove scoperte sul disco di accresciment...
GeForce RTX 3080, problemi di giovent&ug...
Cloud To-Go, l'app di Engenius per sempl...
Smarter STIP, la nuova funzionalit&agrav...
Da metà 2021 un nuovo Office in v...
Nvidia pensa anche al mondo professional...
Novità su Wikipedia, proposto il ...
AMD Ryzen 7 5700U, spunta un test gaming...
Apple presenterà i nuovi iPhone 1...
LG Magnit: ecco il MicroLED di LG
Stop a tutti i veicoli a combustione int...
IObit Uninstaller
GPU Caps Viewer
Opera Portable
Opera 71
Zoom Player Free
CCleaner Portable
CCleaner Standard
Skype
CrystalDiskInfo
Driver Booster
3DMark
K-Lite Codec Pack Update
K-Lite Mega Codec Pack
K-Lite Codec Pack Full
Iperius Backup
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: 16:31.


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