Oggetti in C Lezione 4 Ereditariet II Oggetti

  • Slides: 21
Download presentation
Oggetti in C# Lezione 4 Ereditarietà II Oggetti in C# - Lezione 4

Oggetti in C# Lezione 4 Ereditarietà II Oggetti in C# - Lezione 4

Overload di metodi nella stessa classe

Overload di metodi nella stessa classe

Overload di metodi • Overload = sovraccaricare • In C# posso definire più metodi

Overload di metodi • Overload = sovraccaricare • In C# posso definire più metodi omonimi nella stessa classe purché abbiano parametri differenti e non ambigui class Veicolo { public void Frena(int x); public void Frena(bool x); } OK

Overload di metodi • Però in C# due metodi sovraccaricati nella stessa classe con

Overload di metodi • Però in C# due metodi sovraccaricati nella stessa classe con parametri ambigui sollevano un errore class Veicolo { public void Frena(int x); public bool Frena(double x); } ERRORE anche se restituiscono tipi diversi E vale anche per i costruttori

Overload di costruttori nella stessa classe

Overload di costruttori nella stessa classe

Overload di costruttori • Una classe derivata può sovraccaricare i costruttori • I costruttori

Overload di costruttori • Una classe derivata può sovraccaricare i costruttori • I costruttori devono avere diversi parametri • I costruttori non rendono alcun tipo class Veicolo { public int velocità; public Veicolo (); public Veicolo (int x); public Veicolo (bool b); } class Moto : Veicolo { public Moto (); public Moto (int x); public Moto (double x); }

Ridefinizione di attributi in classe derivata

Ridefinizione di attributi in classe derivata

Ridefinizione di attributi • In C# è possibile dichiarare attributi omonimi a quelli del

Ridefinizione di attributi • In C# è possibile dichiarare attributi omonimi a quelli del padre • È diverso da numerosi linguaggi class Veicolo { bool marce ; . . . } class Auto : Veicolo { int marce ; . . . } OK

Overload di metodi in classe derivata

Overload di metodi in classe derivata

Overload di metodi • Una classe derivata può ridefinire i metodi di un antenato

Overload di metodi • Una classe derivata può ridefinire i metodi di un antenato • Può persino ridefinirlo con prototipo (firma) identico (a) class Veicolo { public int velocità; public bool Fermo(); public void Frena(int x); public bool Frena(); } class Moto : Veicolo { public bool Fermo(); public void Frena(int x); public int Frena(); }

Overload di metodi class Veicolo { public int velocità; public void Frena(int x) {…}

Overload di metodi class Veicolo { public int velocità; public void Frena(int x) {…} public bool Frena() {…} public bool Fermo() {…} } class Moto : Veicolo { public bool Fermo() {…}; } Overload nella stessa classe Overload nella classe derivata

Invocare tra metodi tra stesse classi derivate

Invocare tra metodi tra stesse classi derivate

Invocare metodi da metodi class Veicolo { public int velocità; public void Frena(int x)

Invocare metodi da metodi class Veicolo { public int velocità; public void Frena(int x) { if (velocità > 0) velocità = velocità - x; } public bool Frena() { if (velocità == 0) return false; else Frena (1); } } Un metodo può invocare un metodo della stessa classe

Invocare costruttori da costruttori class Veicolo { public int velocità; public Veicolo (int x)

Invocare costruttori da costruttori class Veicolo { public int velocità; public Veicolo (int x) { velocità = x; } public Veicolo () { this = new Veicolo(0); } public Veicolo () { Veicolo(0) } } NO NO È invece vietato invocare un costruttore da un altro costruttore

Invocare costruttori da costruttori class Veicolo { public int velocità; public Veicolo (int x)

Invocare costruttori da costruttori class Veicolo { public int velocità; public Veicolo (int x) { velocità = x; } public Veicolo () : this (0) { //altre istruzioni eventuali } } NB Ma è possibile invocarlo con chiamata anticipata; così chiamo l’altro costruttore prima di eseguire il corpo del secondo

Invocare costruttori da costruttori • Per invocare un altro costruttore (detto Master) si usa

Invocare costruttori da costruttori • Per invocare un altro costruttore (detto Master) si usa la parola chiave this • this è una parola riservata del linguaggio • this si usa anche per indicare “questo stesso oggetto” • Quando un costruttore è definito con una invocazione anticipata a this: – Prima invoca il costruttore Master (this) – Poi completa il costruttore attuale

Invocare costruttori da costruttori • Quando possibile, si dovrebbe sempre utilizzare questo approccio definendo

Invocare costruttori da costruttori • Quando possibile, si dovrebbe sempre utilizzare questo approccio definendo un costruttore detto “Master” che abbia il maggior numero di parametri di inizializzazione • Gli altri costruttori si appoggiano su questo • Seguire questa metodologia evita duplicazioni di codice, le quali rappresentano sempre delle possibili fonti di errore.

Invocare un metodo base • In alcuni casi è comodo invocare un metodo della

Invocare un metodo base • In alcuni casi è comodo invocare un metodo della classe base • Per esempio evita di rifare le stesse cose dell’antenato e ottimizza la revisione del codice • Questo funziona anche se si ignora come funzioni il metodo dell’antenato • Per farlo si usa la parola riservata base che lavora in modo simile a this ma si riferisce al padre

Invocare un metodo base class Felino { età; public bool Adulto() { return (età

Invocare un metodo base class Felino { età; public bool Adulto() { return (età > 12); }//Adulto }//Felino class Gatto : Felino { string razza; public bool Adulto() { if (razza != "persiano") return base. Adulto(); else return true; }//Adulto }//Gatto Il metodo del figlio invoca il metodo del padre coi giusti parametri (nell’esempio nessun parametro)

Invocare un metodo base class Felino { int età; public Felino() { età =

Invocare un metodo base class Felino { int età; public Felino() { età = 1; }//costruttore public void Mostra() { Console. Write. Line(età); } }//Felino class Gatto : Felino { string razza; public Gatto() { razza = "persiano"; }//costruttore public void Mostra() { base. Mostra(); } }//Gatto g 1 = new Gatto(); g 1. Mostra(); Questa invocazione rende 1

class Figura { Esempio class Quadrato : Figura { int lato; public Figura (int

class Figura { Esempio class Quadrato : Figura { int lato; public Figura (int lato) public Quadrato (int lato) { { //chiama implicitamente Figura() this. lato = lato; } } public Figura() public Quadrato() : this(1) { { this. lato = 1; } } public void Lato() { { base. Lato(); Console. Write. Line(lato); } }