Oggetti in C#
Lezione 3
Oggetti in C# - Lezione 3
Derivare classi da classi
2
•
class Genitore {
//attributi
//metodi
}
•
•
class Figlio : Genitore {
//altri attributi
//altri metodi
}
Da una classe base è possibile
costruire altre classi dette derivate
Le altre classi assumono la forma
della classe base, ma possono essere
arricchite da altri elementi
Le classi derivate possono dichiarare
nuovi costruttori, attributi e metodi;
hanno comunque a disposizione i
costruttori della classe base
Papero base
Genitore G=new Genitore();
Figlio F=new Figlio();
Donald Duck Daisy Duck
Oggetti in C# - Lezione 3
Duffy Duck
Gerarchie di oggetti
3
• Gli oggetti possono essere
costruiti a partire da altri
oggetti
• Formano una gerarchia
padre  figli
Papero base
Donald Duck Daisy Duck
Oggetti in C# - Lezione 3
Duffy Duck
Antenati e Discendenti
4
• Un Antenato è un oggetto da cui
si derivano altri oggetti
• Un Discendente è un oggetto
derivato da altri oggetti
Animale è antenato di
Mammifero e di Felino
Animale
Felino è discendente
di Animale e
di Mammifero
Mammifero
Rettile
Felino
Oggetti in C# - Lezione 3
Canide
Ereditarietà di attributi e metodi
5
• Una classe discendente eredita
gli attributi degli antenati,
i metodi degli antenati,
con le stesse sezioni private e
pubbliche.
• Le istanze discendenti hanno gli
attributi ed i metodi della
propria classe e di tutti gli
antenati
Oggetti in C# - Lezione 3
Antenati e Discendenti
6
• Si consideri la seguente
gerarchia:
Alunno
Stagista
• Tutti gli stagisti sono alunni,
ma ci sono alunni che non
fanno stage
• Gli alunni hanno un
cognome; quindi anche gli
stagisti ce l’hanno
• Gli stagisti hanno una
azienda, gli altri alunni no
Oggetti in C# - Lezione 3
Attributi ereditati
7
class Alunno {
public string cognome ;
public double MediaVoti()
{
. . .
}
}
class Stagista : Alunno {
public string azienda;
public int Rimborso() {...}
}
//istanze
Studente A1 = new Alunno ();
Studente A2 = new Alunno ();
Stagista S1 = new Stagista ();
Stagista S2 = new Stagista ();
//uso istanza base
A1.cognome = “Anna”;
X = A1.MediaVoti();
//uso istanza derivata
S1.cognome = “Biagio”;
Y = S1.MediaVoti();
//uso istanza derivata
S1.azienda = “Eudora”;
Z = S1.Rimborso();
//errori
A1.azienda = “Eudora”;
Z = A1.Rimborso();
Oggetti in C# - Lezione 3
Antenati e Discendenti
8
• Si consideri la seguente
gerarchia:
• Domanda:
Alunno
a1
«è possibile assegnare
a1 ad s1 o viceversa?
• Risposta:
a1 può prendere s1, ma
il contrario è illegale!
Stagista
s1
Oggetti in C# - Lezione 3
Assegnazioni tra istanze
9
class Alunno {
public string cognome ;
public double MediaVoti()
{
. . .
}
}
class Stagista : Alunno {
public string azienda;
public int Rimborso() {...}
}
//istanze
Studente A1 = new Alunno ();
Studente A2 = new Alunno ();
Stagista S1 = new Stagista ();
Stagista S2 = new Stagista ();
/* tra istanze di
stesso tipo */
A1 = A2; //OK, dopo new
/* tra istanze di
stesso tipo */
S1 = S2; //OK, dopo new
/* padre prende figlio
*/
A1 = S1; //OK, dopo new
/* figlio prende padre
*/
S1 = A1; //NO!!!!!
Oggetti in C# - Lezione 3
Perché ?
10
• A = M; //OK
– OK poiché un
Mammifero è anche
un Animale
Animale
• M = A; //NO!
Uccello
Mammifero
– NO poiché un
Animale potrebbe
NON essere un
Mammifero
Piccione
Cane
Gatto
Oggetti in C# - Lezione 3
Costruttori tra istanze
11
• Per lo stesso motivo posso
usare un costruttore figlio per
istanziare una variabile padre
Animale A = new Mammifero();
• Quindi una variabile di tipo
generico può riferirsi ad una
istanza di tipo specifico
• Tuttavia NON può accedere a
attributi e metodi specifici
Oggetti in C# - Lezione 3
Parametri tipo oggetto
12
• Per lo stesso motivo posso
passare un argomento specifico
ad un parametro generico
public void Addestra (Animale A);
• Invocazione:
Mammifero M;
Addestra (M);
Oggetti in C# - Lezione 3
Parametri tipo oggetto
13
• Ma NON se lo passo per
riferimento o risultato
void Addestra (out Animale A);
• Invocazione:
Mammifero M;
Addestra (out M);
Oggetti in C# - Lezione 3
Gerarchie in Visual C#
14
public class Animale {
public string sesso;
public int età;
public string Verso ();
public void Cresci (int anni);
}//fine Animale
var
A , B : Animale ;
Le istanze di Animale
hanno gli attributi
Età e Sesso
e i metodi
Verso e Cresci.
Oggetti in C# - Lezione 3
Gerarchie in Visual C#
15
public class Mammifero : Animale {
public string Pelo;
public string Gestazione;
public bool Adulto;
public void Muovi (int x) ;
}//fine Mammifero
var
M , P : Animale ;
Le istanze di Mammifero hanno gli
attributi
Età , Sesso , Pelo , Gestazione
e i metodi
Verso , Cresci , Adulto , Muovi
Oggetti in C# - Lezione 3
Assegnazioni tra istanze
16
A := B ;
È ammessa l’assegnazione tra
istanze della stessa classe
M := A ;
Non è ammessa l’assegnazione di
una istanza antenata ad una
discendente
A := M ;
È ammessa l’assegnazione di una
istanza discendente ad una antenata
In pratica è ammessa ogni assegnazione dove
ogni attributo e metodo è perfettamente
in C# - Lezione
specificato eOggetti
nulla
resta3 in dubbio
Assegnazioni tra istanze
17
A := B ;
È ammessa
l’assegnazione tra istanze
della stessa classe
Quando assegno un animale ad un altro
gli attributi (sesso ed età ) sono noti,
i metodi pure,
Se B ha definito sesso ed età allora anche A si
troverà definiti gli stessi attributi
Quando dovessi usare A.Età
non ho errori
Oggetti in C# - Lezione 3
Assegnazioni tra istanze
18
A := M ;
È ammessa
l’assegnazione di una
istanza discendente ad
una antenata
Quando assegno un mammifero ad un animale
gli attributi (sesso ed età ) sono noti,
i metodi pure,
Poiché un mammifero è anche un animale allora
l’operazione è ammessa
Quando dovessi usare A.Età
non ho errori
Oggetti in C# - Lezione 3
Assegnazioni tra istanze
19
M := A ;
Non è ammessa
l’assegnazione di una
istanza antenata ad una
discendente
Quando assegno un animale ad un mammifero
gli attributi (pelo e gestazione) NON sono noti,
alcuni metodi nemmeno,
Poiché un animale NON è necessariamente
anche un mammifero allora l’operazione
NON è ammessa
Quando dovessi usare M.Gestazione
avrei degli errori
Oggetti in C# - Lezione 3
Assegnazioni tra istanze
20
M := R ;
R := M ;
Non è ammessa
l’assegnazione di istanze
sorelle
Non posso assegnare un rettile ad un mammifero
Non posso assegnare un mammifero ad un rettile
Tutti gli attributi
Animale
specifici sarebbero
indeterminati
Mammifero
Oggetti in C# - Lezione 3
Rettile
Limitazioni dei discendenti
21
• Se un antenato ha già dichiarato degli
attributi nella classe discendente NON è
possibile dichiarare nuovi attributi con lo
stesso nome (anche se con tipi diversi) !
public class Animale {
public int età;
public string Verso ();
}//fine Animale
public class Rettile : Animale {
int età;
public bool Verso ();
}
Oggetti in C# - Lezione 3
Errati
entrambi
Esercizio
22
• Definire una nuova classe Giovane con:
1. Attributi nome, età e sesso
2. Costruttore col nome parametrizzato mentre
l’età è impostata a 13 e sesso a stringa vuota
3. Metodo Compleanno che incrementa l’età +1
4. Metodo Imposta-Sesso parametrizzato; il
sesso deve ammettere i soli valori M o F o
vuoto
5. Metodo Imposta-Età parametrizzato; l’età
deve ammettere valori tra 1 e 150
Oggetti in C# - Lezione 3
Esercizio
23
• Definire una classe Studente derivata da
Giovane con:
1. Attributo classe
2. Costruttore col nome e la classe parametrizzati
e il resto come per il Giovane
3. Attributo Voti, un array di 20 voti interi
4. Metodo imposta voti che copia un parametro
nei voti
5. Metodo Media che restituisce la media dei voti
6. Metodo Promosso che rende true se tutti i voti
sono sufficienti, altrimenti false
7. Metodo Debiti che rende il numero di voti <6
Oggetti in C# - Lezione 3
Domande
24
• Con riferimento alle classi appena viste:
È possibile istanziare una variabile Giovane col
costruttore di Studente ? si no
È possibile istanziare una variabile Studente col
costruttore di Giovane ? si no
Una variabile Studente può invocare il metodo
Compleanno? si no
Una variabile Giovane può invocare il metodo
Promosso? si no
Oggetti in C# - Lezione 3
Scarica

public class