Oggetti in C#
Lezione 1
Oggetti in C# - Lezione 1
L’idea degli oggetti
2
Una classe è una
categoria di
“cose” o di
“soggetti”
Per esempio
Automobile, Cane
o Persona
Una classe è un tipo base
da cui dichiarare
elementi
Per esempio Rex,
Pluto e Lassie
sono tutti
elementi di Cane
Oggetti in C# - Lezione 1
Classi e istanze
3
class Rectangle
{
int side1, side2;
//lati del rettangolo
}
Dichiarazione
della classe
La classe è
un tipo di dato
Utilizzo della classe
{
Rectangle R ;
R = new Rectangle();
}
La creazione
dell’oggetto è
corretta
La variabile di tipo
classe è detta
istanza
Oggetti in C# - Lezione 1
Punti di vista
4
Classe
È il tipo di dato
Come il progetto di una
casa, non è la casa
stessa. . .
Definisce però come
sarà costruita tutta la
struttura
In alcuni casi può
memorizzare dei dati,
ma non di istanza
Variabile
istanza
È una
variabile
riferimento
Istanza
È una porzione di
memoria, allocata in
heap, che cusodisce
i dati.
È’ l’oggetto vero e
proprio: deve essere
istanziato prima di
essere usato.
Ogni
variabile
punta a una
istanza
Oggetti in C# - Lezione 1
Classi e attributi
5
class Rectangle
{
int side1, side2;
//lati del rettangolo
}
Le variabili
interne alla classe
sono detti
attributi
Le variabili
interne sono
private ovvero non
raggiungibili
dall’esterno
Utilizzo della classe
{
Rectangle R ;
R = new Rectangle();
R.side1 = 12;
errore
int x = R.side2;
}
L’accesso agli
attributi è errato
L’errore c’è
perché gli
attributi sono
privati
Oggetti in C# - Lezione 1
Attributi privati e pubblici
6
class Rectangle
{
int side1, side2;
public string Colore;
private Boolean attivo;
}
Le parti interne alla classe
possono essere pubbliche
o private
Quelle pubbliche
possono essere
accessibili
dall’esterno
Utilizzo della classe
{
Rectangle R ;
R = new Rectangle();
R.Colore = “rosso";
R.attivo = true;
errore
}
L’accesso al colore
è corretto perché
pubblico
L’accesso ad
attivo invece è
errato, perché
privato
Oggetti in C# - Lezione 1
Attributi privati e pubblici
7
class Rectangle
{
int side1, side2;
public string Colore;
private Boolean attivo;
}
Se non si esplicita, si
presuppone che le parti
siano private
Questo
meccanismo è
detto
incapsulamento
Utilizzo della classe
{
Rectangle R ;
R = new Rectangle();
R.side1 = 13;
errore
R.attivo = true;
}
Di solito è preferibile
nascondere parti
all’esterno. Questo
impedisce errori ed
evita violazioni di
accesso. Ci sono altri
modi per accedere
all’oggetto
Oggetti in C# - Lezione 1
Costruttori della classe
8
class Rectangle
{
int side1, side2;
public Rectangle()
{
//costruttore vuoto
}
}
Una classe deve
avere un
costruttore
Il costruttore
serve per creare
istanze della
classe, ed ha il
suo stesso nome
Utilizzo della classe
{
Rectangle R ;
R = new Rectangle();
}
Il costruttore si usa con
l’operatore new
Il costruttore
alloca memoria per
l’istanza e rende
l’indirizzo
Oggetti in C# - Lezione 1
Costruttori della classe
9
class Rectangle
{
public int side1, side2;
public Rectangle()
{ }
public Rectangle
(int x, int y)
{
side1 = x;
side2 = y;
}
}
Una classe può
avere più
costruttori I costruttori
devono avere
qualche
differenza ma lo
stesso nome
Utilizzo della classe
{
Rectangle R ;
R.side1 = 17 ;
int i = R.side2;
}
errore
Non è possibile usare
l’istanza senza invocare
prima il costruttore
Il sistema avverte
che non c’è nessuna
struttura associata
alla variabile
Oggetti in C# - Lezione 1
Costruttori della classe
10
class Rectangle
{
int side1, side2;
public Rectangle()
{
//costruttore vuoto
}
public Rectangle(int x)
{
side = x ;
}
Una classe può avere
}
molti costruttori; si
dice overload del
costruttore.
Overload vuole dire
sovraccarico
Utilizzo della classe
{
Rectangle R1, R2;
R1 = new Rectangle();
R2 = new Rectangle(13);
}
Il sistema riconosce
quale costruttore usare
dai parametri
Il secondo
costruttore ha un
parametro di tipo
int
Oggetti in C# - Lezione 1
Costruttori della classe
11
class Rectangle
{
private int _s1, _s2;
private Rectangle
(int x, int y)
{
_s1 = x;
_s2 = y;
}
}
Utilizzo della classe
{
Rectangle R ;
R = new Rectangle();
}
Non è possibile usare
l’istanza senza invocare
prima il costruttore
È possibile avere
costruttori privati
Ma questo
impedisce di
essere invocati
dall’esterno!
Ma se nessun
costruttore è più
pubblico ho problemi
Oggetti in C# - Lezione 1
Riepilogo
12
• Classe è un tipo di dato oggetto
• Istanza è la variabile di tipo oggetto
• Ogni classe ha un costruttore; se non esplicito il
sistema ne associa uno in automatico
• Il costruttore serve per allocare memoria per le
istanze
• Il costruttore è omonimo della classe
• È possibile l’overload dei costruttori
• Le parti dell’oggetto possono essere private o
pubbliche; se non si specifica nessuna opzione si
presuppone siano private
• Il meccanismo di parti private è detto
incapsulamento
Oggetti in C# - Lezione 1
Esercizio
13
• Si dichiari una classe Vector che
incapsula un vettore di interi
• Preparare un costruttore che
inserisca in ogni cella uno stesso
numero, passato per parametro
• Preparare un costruttore che
inserisca in ogni cella un valore casuale
• Scrivere un uso di sue istanze
Oggetti in C# - Lezione 1
Assegnazioni tra istanze
14
class Rectangle
{
public int x, y;
public Boolean visible ;
public Rectangle
(int x , int y)
{
this.x = x ;
this.y = y ;
visible = true ;
}
}
Le istanze sono tipi
riferimento; sono
allocate nello heap
Rectangle R1, R2 ;
R1 = new Rectangle(2 , 3);
R2 = R1 ; //condivisione
R2.y = 7 ;
R1 e R2 condividono lo
stesso spazio; modificare una
implica modificare l’altra
R1
R2
L’assegnazione tra istanze
implica la condivisione
dei dati; l’assegnazione tra
attributi non sempre
Oggetti in C# - Lezione 1
x = 2
y = 3
7
Assegnazioni tra istanze
15
class Rectangle
{
public int x, y;
public Boolean visible ;
public Rectangle
(int x , int y)
{
this.x = x ;
this.y = y ;
visible = true ;
}
}
Ogni volta che si invoca un costruttore
si alloca memoria nello heap, ma
l’indirizzo della struttura che l’istanza
conserva sta nello stack
Rectangle R1, R2 ;
R1 = new Rectangle(2 , 3);
R2 = new Rectangle(2 , 3);
R2.y = 7 ;
x = 2
y = 3
R1
R2
x = 2
y = 3
7
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!
Oggetti in C# - Lezione 1
Scarica

Classe - Infozoc