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