oggetti in c# - lezione 1 oggetti in c# lezione 1

15
Oggetti in C# - Lezione 1 Oggetti in C# Oggetti in C# Lezione 1 Lezione 1

Upload: macario-fedele

Post on 02-May-2015

243 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: Oggetti in C# - Lezione 1 Oggetti in C# Lezione 1

Oggetti in C# - Lezione 1

Oggetti in C#Oggetti in C#

Lezione 1Lezione 1

Page 2: Oggetti in C# - Lezione 1 Oggetti in C# Lezione 1

22

Oggetti in C# - Lezione 1

LL’’idea degli oggettiidea degli oggetti

Una classe è Una classe è una categoria di una categoria di “cose” o di “cose” o di “soggetti”“soggetti”

Una classe è Una classe è una categoria di una categoria di “cose” o di “cose” o di “soggetti”“soggetti”

Per esempio Per esempio Automobile, Automobile, Cane o PersonaCane o Persona

Per esempio Per esempio Automobile, Automobile, Cane o PersonaCane o Persona

Una classe è un tipo Una classe è un tipo base da cui dichiarare base da cui dichiarare elementielementi

Una classe è un tipo Una classe è un tipo base da cui dichiarare base da cui dichiarare elementielementi

Per esempio Per esempio Rex, Pluto e Rex, Pluto e Lassie sono tutti Lassie sono tutti elementi di elementi di CaneCane

Per esempio Per esempio Rex, Pluto e Rex, Pluto e Lassie sono tutti Lassie sono tutti elementi di elementi di CaneCane

Page 3: Oggetti in C# - Lezione 1 Oggetti in C# Lezione 1

33

Oggetti in C# - Lezione 1

Classi e istanzeClassi e istanze class Rectangle

{

int side1, side2;

//lati del rettangolo

}

Utilizzo della classe

{

Rectangle R ;

R = new Rectangle();

}

Dichiarazione Dichiarazione della classedella classeDichiarazione Dichiarazione della classedella classe

La La classeclasse è è un tipo di datoun tipo di datoLa La classeclasse è è un tipo di datoun tipo di dato

La creazione La creazione dell’oggetto è dell’oggetto è correttacorretta

La creazione La creazione dell’oggetto è dell’oggetto è correttacorretta

La variabile di La variabile di tipo classe è tipo classe è detta detta istanzaistanza

La variabile di La variabile di tipo classe è tipo classe è detta detta istanzaistanza

Page 4: Oggetti in C# - Lezione 1 Oggetti in C# Lezione 1

44

Oggetti in C# - Lezione 1

Punti di vistaPunti di vistaClasseClasse

È il tipo di datoCome il progetto di una casa, non è la

casa stessa. . . Definisce però come sarà costruita tutta la

strutturaIn alcuni casi può

memorizzare dei dati, ma non di istanza

VariabileVariabileistanzaistanza

È una È una variabile variabile

riferimentoriferimento

Ogni Ogni variabile variabile

punta a una punta a una istanzaistanza

IstanzaIstanzaÈ una porzione di memoria, allocata

in heap, che cusodisce i dati.

È’ l’oggetto vero e proprio: deve

essere istanziato prima di essere

usato.

Page 5: Oggetti in C# - Lezione 1 Oggetti in C# Lezione 1

55

Oggetti in C# - Lezione 1

Classi e attributiClassi e attributi class Rectangle

{

int side1, side2;

//lati del rettangolo

}

Utilizzo della classe

{

Rectangle R ;

R = new Rectangle();

R.side1 = 12;

int x = R.side2;

}Le variabili Le variabili interne alla interne alla classe sono detti classe sono detti attributiattributi

Le variabili Le variabili interne alla interne alla classe sono detti classe sono detti attributiattributi Le variabili Le variabili

interne sono interne sono privateprivate ovvero ovvero non raggiungibili non raggiungibili dall’esternodall’esterno

Le variabili Le variabili interne sono interne sono privateprivate ovvero ovvero non raggiungibili non raggiungibili dall’esternodall’esterno

L’accesso agli L’accesso agli attributi è erratoattributi è erratoL’accesso agli L’accesso agli attributi è erratoattributi è errato

L’errore c’è L’errore c’è perché gli perché gli attributi sono attributi sono privatiprivati

L’errore c’è L’errore c’è perché gli perché gli attributi sono attributi sono privatiprivati

erroreerrore

Page 6: Oggetti in C# - Lezione 1 Oggetti in C# Lezione 1

66

Oggetti in C# - Lezione 1

Attributi privati e pubbliciAttributi privati e pubblici class Rectangle

{

int side1, side2;

public string Colore;

private Boolean attivo;

}

Utilizzo della classe

{

Rectangle R ;

R = new Rectangle();

R.Colore = “rosso";

R.attivo = true;

}Le parti interne alla Le parti interne alla classe possono essere classe possono essere pubblichepubbliche o o privateprivate

Le parti interne alla Le parti interne alla classe possono essere classe possono essere pubblichepubbliche o o privateprivate

Quelle Quelle pubblichepubbliche possono essere possono essere accessibili accessibili dall’esternodall’esterno

Quelle Quelle pubblichepubbliche possono essere possono essere accessibili accessibili dall’esternodall’esterno

L’accesso al L’accesso al colore è corretto colore è corretto perché perché pubblicopubblico

L’accesso al L’accesso al colore è corretto colore è corretto perché perché pubblicopubblico

L’accesso ad L’accesso ad attivo invece è attivo invece è errato, perché errato, perché privatoprivato

L’accesso ad L’accesso ad attivo invece è attivo invece è errato, perché errato, perché privatoprivato

erroreerrore

Page 7: Oggetti in C# - Lezione 1 Oggetti in C# Lezione 1

77

Oggetti in C# - Lezione 1

Attributi privati e pubbliciAttributi privati e pubblici class Rectangle

{

int side1, side2;

public string Colore;

private Boolean attivo;

}

Utilizzo della classe

{

Rectangle R ;

R = new Rectangle();

R.side1 = 13;

R.attivo = true;

}Se non si esplicita, si Se non si esplicita, si presuppone che le presuppone che le parti siano privateparti siano private

Se non si esplicita, si Se non si esplicita, si presuppone che le presuppone che le parti siano privateparti siano private

Questo Questo meccanismo è meccanismo è detto detto incapsulamentoincapsulamento

Questo Questo meccanismo è meccanismo è detto detto incapsulamentoincapsulamento

Di solito è preferibile Di solito è preferibile nascondere parti nascondere parti all’esterno. Questo all’esterno. Questo impedisce errori ed impedisce errori ed evita violazioni di evita violazioni di accesso. Ci sono altri accesso. Ci sono altri modi per accedere modi per accedere all’oggettoall’oggetto

Di solito è preferibile Di solito è preferibile nascondere parti nascondere parti all’esterno. Questo all’esterno. Questo impedisce errori ed impedisce errori ed evita violazioni di evita violazioni di accesso. Ci sono altri accesso. Ci sono altri modi per accedere modi per accedere all’oggettoall’oggetto

erroreerrore

Page 8: Oggetti in C# - Lezione 1 Oggetti in C# Lezione 1

88

Oggetti in C# - Lezione 1

Costruttori della classeCostruttori della classe class Rectangle

{

int side1, side2;

public Rectangle()

{

//costruttore vuoto

}

}

Utilizzo della classe

{

Rectangle R ;

R = new Rectangle();

}

Una classe Una classe devedeve avere un avere un costruttorecostruttore

Una classe Una classe devedeve avere un avere un costruttorecostruttore

Il costruttore Il costruttore serve per creare serve per creare istanze della istanze della classe, ed ha il classe, ed ha il suo suo stesso nomestesso nome

Il costruttore Il costruttore serve per creare serve per creare istanze della istanze della classe, ed ha il classe, ed ha il suo suo stesso nomestesso nome

Il costruttore si usa Il costruttore si usa con l’operatore con l’operatore newnewIl costruttore si usa Il costruttore si usa con l’operatore con l’operatore newnew

Il costruttore Il costruttore alloca memoriaalloca memoria per l’istanza e per l’istanza e rende l’indirizzorende l’indirizzo

Il costruttore Il costruttore alloca memoriaalloca memoria per l’istanza e per l’istanza e rende l’indirizzorende l’indirizzo

Page 9: Oggetti in C# - Lezione 1 Oggetti in C# Lezione 1

99

Oggetti in C# - Lezione 1

Costruttori della classeCostruttori della classeclass Rectangle

{

public int side1, side2;

public Rectangle()

{ }

public Rectangle (int x, int

y)

{ side1 = x;

side2 = y; }

}

Utilizzo della classe

{

Rectangle R ;

R.side1 = 17 ;

int i = R.side2;

}

Una classe può Una classe può avere più avere più costruttoricostruttori

Una classe può Una classe può avere più avere più costruttoricostruttori I costruttori I costruttori

devono avere devono avere qualche qualche differenza ma lo differenza ma lo stesso nomestesso nome

I costruttori I costruttori devono avere devono avere qualche qualche differenza ma lo differenza ma lo stesso nomestesso nome

Non è possibile usare Non è possibile usare l’istanza senza l’istanza senza invocare prima il invocare prima il costruttorecostruttore

Non è possibile usare Non è possibile usare l’istanza senza l’istanza senza invocare prima il invocare prima il costruttorecostruttoreIl sistema Il sistema avverteavverte

che non c’è che non c’è nessuna struttura nessuna struttura associata alla associata alla variabilevariabile

Il sistema Il sistema avverteavverte che non c’è che non c’è nessuna struttura nessuna struttura associata alla associata alla variabilevariabile

erroreerrore

Page 10: Oggetti in C# - Lezione 1 Oggetti in C# Lezione 1

1010

Oggetti in C# - Lezione 1

Costruttori della classeCostruttori della classe class Rectangle

{

int side1, side2;

public Rectangle()

{

//costruttore vuoto

}

public Rectangle(int x)

{

side = x ;

}

}

Utilizzo della classe

{

Rectangle R1, R2;

R1 = new Rectangle();

R2 = new Rectangle(13);

}

Una classe può Una classe può avere avere molti molti costruttoricostruttori; si dice ; si dice overload del overload del costruttore.costruttore.OverloadOverload vuole dire vuole dire

sovraccaricosovraccarico

Una classe può Una classe può avere avere molti molti costruttoricostruttori; si dice ; si dice overload del overload del costruttore.costruttore.OverloadOverload vuole dire vuole dire

sovraccaricosovraccarico

Il sistema riconosce Il sistema riconosce quale costruttore quale costruttore usare dai parametriusare dai parametri

Il sistema riconosce Il sistema riconosce quale costruttore quale costruttore usare dai parametriusare dai parametri

Il secondo Il secondo costruttore ha un costruttore ha un parametro di tipo parametro di tipo intint

Il secondo Il secondo costruttore ha un costruttore ha un parametro di tipo parametro di tipo intint

Page 11: Oggetti in C# - Lezione 1 Oggetti in C# Lezione 1

1111

Oggetti in C# - Lezione 1

Costruttori della classeCostruttori della classeclass Rectangle

{

private int _s1, _s2;

private Rectangle

(int x, int y)

{ _s1 = x;

_s2 = y; }

}

Utilizzo della classe

{

Rectangle R ;

R = new Rectangle();

}

È possibile È possibile avere avere costruttori costruttori privatiprivati

È possibile È possibile avere avere costruttori costruttori privatiprivati

Ma questo Ma questo impedisceimpedisce di di essere invocati essere invocati dall’dall’esternoesterno!!

Ma questo Ma questo impedisceimpedisce di di essere invocati essere invocati dall’dall’esternoesterno!!

Non è possibile usare Non è possibile usare l’istanza senza l’istanza senza invocare prima il invocare prima il costruttorecostruttore

Non è possibile usare Non è possibile usare l’istanza senza l’istanza senza invocare prima il invocare prima il costruttorecostruttore

Ma se nessun Ma se nessun costruttore è più costruttore è più pubblico ho pubblico ho problemiproblemi

Ma se nessun Ma se nessun costruttore è più costruttore è più pubblico ho pubblico ho problemiproblemi

Page 12: Oggetti in C# - Lezione 1 Oggetti in C# Lezione 1

1212

Oggetti in C# - Lezione 1

RiepilogoRiepilogo• ClasseClasse è un tipo di dato oggetto è un tipo di dato oggetto• IstanzaIstanza è la variabile di tipo oggetto è la variabile di tipo oggetto• Ogni classe ha un Ogni classe ha un costruttorecostruttore; se non esplicito ; se non esplicito

il sistema ne associa uno in automaticoil sistema ne associa uno in automatico• Il Il costruttorecostruttore serve per allocare memoria per le serve per allocare memoria per le

istanzeistanze• Il costruttore è Il costruttore è omonimoomonimo della classe della classe• È possibile È possibile l’overloadl’overload dei costruttori dei costruttori• Le parti dell’oggetto possono essere Le parti dell’oggetto possono essere privateprivate o o

pubblichepubbliche; se non si specifica nessuna opzione ; se non si specifica nessuna opzione si presuppone siano privatesi presuppone siano private

• Il meccanismo di parti private è detto Il meccanismo di parti private è detto incapsulamentoincapsulamento

Page 13: Oggetti in C# - Lezione 1 Oggetti in C# Lezione 1

1313

Oggetti in C# - Lezione 1

EsercizioEsercizio

• Si dichiari una classe Si dichiari una classe VectorVector che che incapsula un vettore di interiincapsula un vettore di interi

• Preparare un Preparare un costruttorecostruttore che che inserisca in ogni cella uno stesso inserisca in ogni cella uno stesso numero, passato per parametronumero, passato per parametro

• Preparare un costruttore che Preparare un costruttore che inserisca in ogni cella un valore inserisca in ogni cella un valore casualecasuale

• Scrivere un uso di sue istanzeScrivere un uso di sue istanze

Page 14: Oggetti in C# - Lezione 1 Oggetti in C# Lezione 1

1414

Oggetti in C# - Lezione 1

Assegnazioni tra istanzeAssegnazioni tra istanzeclass Rectangle { public int x, y; public Boolean visible ; public Rectangle

(int x , int y)

{ this.x = x ; this.y = y ; visible = true ;

}}

Rectangle R1, R2 ;R1 = new Rectangle(2 , 3);R2 = R1 ; //condivisioneR2.y = 7 ;

Le istanze sono tipi Le istanze sono tipi riferimento; sono riferimento; sono

allocate nello heapallocate nello heap

Le istanze sono tipi Le istanze sono tipi riferimento; sono riferimento; sono

allocate nello heapallocate nello heap

L’assegnazione tra istanze L’assegnazione tra istanze implica la condivisione implica la condivisione dei dati; l’assegnazione dei dati; l’assegnazione tra attributi non sempretra attributi non sempre

L’assegnazione tra istanze L’assegnazione tra istanze implica la condivisione implica la condivisione dei dati; l’assegnazione dei dati; l’assegnazione tra attributi non sempretra attributi non sempre

x = 2x = 2y = y = 33

R1R1R2R2

R1 e R2 condividono lo R1 e R2 condividono lo stesso spazio; modificare una stesso spazio; modificare una

implica modificare l’altraimplica modificare l’altra

77

Page 15: Oggetti in C# - Lezione 1 Oggetti in C# Lezione 1

1515

Oggetti in C# - Lezione 1

Assegnazioni tra istanzeAssegnazioni tra istanzeclass Rectangle { public int x, y; public Boolean visible ; public Rectangle

(int x , int y)

{ this.x = x ; this.y = y ; visible = true ;

}}

Rectangle R1, R2 ;R1 = new Rectangle(2 , 3);R2 = new Rectangle(2 , 3);R2.y = 7 ;

Ogni volta che si invoca un costruttore si alloca memoria nello heap, ma l’indirizzo della struttura

che l’istanza conserva sta nello stack

Ogni volta che si invoca un costruttore si alloca memoria nello heap, ma l’indirizzo della struttura

che l’istanza conserva sta nello stack

Se due istanze sono costruite distintamente allora ciascuna avrà il suo

spazio di memoria; in questo caso la modifica di una NON coinvolge l’altra; una assegnazione tra istanze fa perdere

l’oggetto costruito in precedenza!

Se due istanze sono costruite distintamente allora ciascuna avrà il suo

spazio di memoria; in questo caso la modifica di una NON coinvolge l’altra; una assegnazione tra istanze fa perdere

l’oggetto costruito in precedenza!

x = 2x = 2y = 3y = 3R1R1

R2R2

77

x = 2x = 2y = y = 33