Oggetti in C Lezione 3 Oggetti in C

  • Slides: 24
Download presentation
Oggetti in C# Lezione 3 Oggetti in C# - Lezione 3

Oggetti in C# Lezione 3 Oggetti in C# - Lezione 3

2 Derivare classi da classi • class Genitore { //attributi //metodi } • •

2 Derivare classi da classi • 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

3 Gerarchie di oggetti • Gli oggetti possono essere costruiti a partire da altri

3 Gerarchie di oggetti • 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

4 Antenati e Discendenti • Un Antenato è un oggetto da cui si derivano

4 Antenati e Discendenti • 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 Rettile Felino Oggetti in C# - Lezione 3 Canide

5 Ereditarietà di attributi e metodi • Una classe discendente eredita �gli attributi degli

5 Ereditarietà di attributi e metodi • 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

6 Antenati e Discendenti • Si consideri la seguente gerarchia: Alunno Stagista • Tutti

6 Antenati e Discendenti • 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

7 Attributi ereditati class Alunno { public string cognome ; public double Media. Voti()

7 Attributi ereditati class Alunno { public string cognome ; public double Media. Voti() {. . . } } class Stagista : Alunno { public string azienda; public int Rimborso() {. . . } } //istanze Studente A 1 = new Alunno (); Studente A 2 = new Alunno (); Stagista S 1 = new Stagista (); Stagista S 2 = new Stagista (); //uso istanza base A 1. cognome = “Anna”; X = A 1. Media. Voti(); //uso istanza derivata S 1. cognome = “Biagio”; Y = S 1. Media. Voti(); //uso istanza derivata S 1. azienda = “Eudora”; Z = S 1. Rimborso(); //errori A 1. azienda = “Eudora”; Z = A 1. Rimborso(); Oggetti in C# - Lezione 3

8 Antenati e Discendenti • Si consideri la seguente gerarchia: • Domanda: Alunno a

8 Antenati e Discendenti • Si consideri la seguente gerarchia: • Domanda: Alunno a 1 «è possibile assegnare a 1 ad s 1 o viceversa? • Risposta: a 1 può prendere s 1, ma il contrario è illegale! Stagista s 1 Oggetti in C# - Lezione 3

9 Assegnazioni tra istanze class Alunno { public string cognome ; public double Media.

9 Assegnazioni tra istanze class Alunno { public string cognome ; public double Media. Voti() {. . . } } class Stagista : Alunno { public string azienda; public int Rimborso() {. . . } } //istanze Studente A 1 = new Alunno (); Studente A 2 = new Alunno (); Stagista S 1 = new Stagista (); Stagista S 2 = new Stagista (); /* tra istanze stesso tipo A 1 = A 2; //OK, /* tra istanze stesso tipo S 1 = S 2; //OK, di */ dopo new /* padre prende figlio */ A 1 = S 1; //OK, dopo new /* figlio prende padre */ S 1 = A 1; //NO!!!!! Oggetti in C# - Lezione 3

10 Perché ? • A = M; //OK – OK poiché un Mammifero è

10 Perché ? • A = M; //OK – OK poiché un Mammifero è anche un Animale • M = A; //NO! Uccello Mammifero Piccione Cane – NO poiché un Animale potrebbe NON essere un Mammifero Gatto Oggetti in C# - Lezione 3

11 Costruttori tra istanze • Per lo stesso motivo posso usare un costruttore figlio

11 Costruttori tra istanze • 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

12 Parametri tipo oggetto • Per lo stesso motivo posso passare un argomento specifico

12 Parametri tipo oggetto • 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

13 Parametri tipo oggetto • Ma NON se lo passo per riferimento o risultato

13 Parametri tipo oggetto • 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

14 Gerarchie in Visual C# public class Animale { public string sesso; public int

14 Gerarchie in Visual C# 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

15 Gerarchie in Visual C# public class Mammifero : Animale { public string Pelo;

15 Gerarchie in Visual C# 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

16 Assegnazioni tra istanze A : = B ; È ammessa l’assegnazione tra istanze

16 Assegnazioni tra istanze 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# - resta Lezione 3 specificato. Oggetti e nulla in dubbio

17 Assegnazioni tra istanze A : = B ; È ammessa l’assegnazione tra istanze

17 Assegnazioni tra istanze 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

18 Assegnazioni tra istanze A : = M ; È ammessa l’assegnazione di una

18 Assegnazioni tra istanze 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

19 Assegnazioni tra istanze M : = A ; Non è ammessa l’assegnazione di

19 Assegnazioni tra istanze 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

20 Assegnazioni tra istanze M : = R ; R : = M ;

20 Assegnazioni tra istanze 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 specifici sarebbero indeterminati Oggetti in C# Lezione 3

21 Limitazioni dei discendenti • Se un antenato ha già dichiarato degli attributi nella

21 Limitazioni dei discendenti • 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

22 Esercizio • Definire una nuova classe Giovane con: 1. Attributi nome, età e

22 Esercizio • 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

23 Esercizio • Definire una classe Studente derivata da Giovane con: 1. Attributo classe

23 Esercizio • 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

24 Domande • Con riferimento alle classi appena viste: È possibile istanziare una variabile

24 Domande • 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