andrea zoccheddu oggetti in c# lezione 5 polimorfismo i
TRANSCRIPT
![Page 1: Andrea Zoccheddu Oggetti in C# Lezione 5 Polimorfismo I](https://reader033.vdocuments.site/reader033/viewer/2022061515/5542eb74497959361e8dcde5/html5/thumbnails/1.jpg)
Andrea Zoccheddu
Oggetti in C#Oggetti in C#
Lezione 5Lezione 5
PolimorfismoPolimorfismoII
![Page 2: Andrea Zoccheddu Oggetti in C# Lezione 5 Polimorfismo I](https://reader033.vdocuments.site/reader033/viewer/2022061515/5542eb74497959361e8dcde5/html5/thumbnails/2.jpg)
Facciamo chiarezza
Abbiamo visto che è possibile ridefinire i metodi di una classe derivata
Ma in realtà esistono due differenti modi di re-dichiarazione:
• 1. OVERLOADING, sovrapposizione
• 2. OVERRIDING, scavalcamento
![Page 3: Andrea Zoccheddu Oggetti in C# Lezione 5 Polimorfismo I](https://reader033.vdocuments.site/reader033/viewer/2022061515/5542eb74497959361e8dcde5/html5/thumbnails/3.jpg)
OVERLOADING
È il modo più semplice di ridefinire un metodoLa classe discendente semplicemente lo dichiara e definisce di nuovo
class Felino{ public void Verso() { Console.WriteLine("MEOW"); }}//Felino
class Gatto : Felino{ public void Verso() { Console.WriteLine("MIAO"); }}//Gatto
![Page 4: Andrea Zoccheddu Oggetti in C# Lezione 5 Polimorfismo I](https://reader033.vdocuments.site/reader033/viewer/2022061515/5542eb74497959361e8dcde5/html5/thumbnails/4.jpg)
OVERLOADING
È il modo più semplice di ridefinire un metodo
Il metodo è legato staticamenteIl f1 chiama il verso del FelinoIl g1 chiama il verso del Gatto
Felino f1 = new Felino(); f1.Verso();
Gatto g1 = new Gatto();g1.Verso();
MEOW MIAO
![Page 5: Andrea Zoccheddu Oggetti in C# Lezione 5 Polimorfismo I](https://reader033.vdocuments.site/reader033/viewer/2022061515/5542eb74497959361e8dcde5/html5/thumbnails/5.jpg)
OVERLOADING
Nella ridefinizione si può invocare il metodo del padre
Il metodo può sfruttare quanto predisposto dal metodo paterno
class Felino{ public void Verso() { Console.WriteLine("MEOW"); }}//Felino
class Gatto : Felino{ public void Verso() { base.Verso(); Console.WriteLine("MIAO"); }}//Gatto
![Page 6: Andrea Zoccheddu Oggetti in C# Lezione 5 Polimorfismo I](https://reader033.vdocuments.site/reader033/viewer/2022061515/5542eb74497959361e8dcde5/html5/thumbnails/6.jpg)
OVERLOADING
È il modo più semplice di ridefinire un metodo
Il metodo è legato staticamenteIl f1 chiama il verso del FelinoIl g1 chiama il verso del Gatto
Felino f1 = new Felino(); f1.Verso();
Gatto g1 = new Gatto();g1.Verso();
MEOWMEOWMIAO
![Page 7: Andrea Zoccheddu Oggetti in C# Lezione 5 Polimorfismo I](https://reader033.vdocuments.site/reader033/viewer/2022061515/5542eb74497959361e8dcde5/html5/thumbnails/7.jpg)
Andrea Zoccheddu
un casoun caso
particolareparticolare
![Page 8: Andrea Zoccheddu Oggetti in C# Lezione 5 Polimorfismo I](https://reader033.vdocuments.site/reader033/viewer/2022061515/5542eb74497959361e8dcde5/html5/thumbnails/8.jpg)
Un caso particolare
Ma si osservi questa situazione:class Felino{
public void Fusa (){Console.WriteLine("Grrr");}
public void Contento(){this.Fusa();Console.WriteLine("Struscia");}
}//Felino
class Gatto : Felino{
public void Fusa (){Console.WriteLine("Prrr");}
public void Contento(){this.Fusa();Console.WriteLine("Struscia");}
}//Gatto
i metodi Contento sono molto simili
![Page 9: Andrea Zoccheddu Oggetti in C# Lezione 5 Polimorfismo I](https://reader033.vdocuments.site/reader033/viewer/2022061515/5542eb74497959361e8dcde5/html5/thumbnails/9.jpg)
Un caso particolareQuando si invocano i metodi essi si comportano bene:
Però quei metodi «Contento» sono proprio identici… è possibile evitare di ripetere il secondo?In fondo il metodo è ereditato dal padre ...
Felino f1 = new Felino(); f1.Contento();
Gatto g1 = new Gatto();g1. Contento();
GRRRStruscia
PRRRStruscia
![Page 10: Andrea Zoccheddu Oggetti in C# Lezione 5 Polimorfismo I](https://reader033.vdocuments.site/reader033/viewer/2022061515/5542eb74497959361e8dcde5/html5/thumbnails/10.jpg)
Un caso particolare
Le definizioni diventerebbero:class Felino{
public void Fusa (){Console.WriteLine("Grrr");}
public void Contento(){this.Fusa();Console.WriteLine("Struscia");}
}//Felino
class Gatto : Felino{
public void Fusa (){Console.WriteLine("Prrr");}
}//Gatto
il metodo Contento è ereditato da Gatto
![Page 11: Andrea Zoccheddu Oggetti in C# Lezione 5 Polimorfismo I](https://reader033.vdocuments.site/reader033/viewer/2022061515/5542eb74497959361e8dcde5/html5/thumbnails/11.jpg)
Un caso particolare
Quando si invocano i metodi però:
Il metodo Contento del gatto usa il metodo Fusa del Felino invece del suo, ed il motivo è il legame statico
Felino f1 = new Felino(); f1.Contento();
Gatto g1 = new Gatto();g1. Contento();
GRRRStruscia
GRRRStruscia
![Page 12: Andrea Zoccheddu Oggetti in C# Lezione 5 Polimorfismo I](https://reader033.vdocuments.site/reader033/viewer/2022061515/5542eb74497959361e8dcde5/html5/thumbnails/12.jpg)
Un caso particolare• Il problema lo causa il metodo
Contento del Felino• Quando viene compilato il
riferimento al metodo Fusa è statico e quindi impone un collegamento fisso
• Anche se è un Gatto che invoca il metodo Contento ormai il metodo è legato al metodo Fusa del Felino
![Page 13: Andrea Zoccheddu Oggetti in C# Lezione 5 Polimorfismo I](https://reader033.vdocuments.site/reader033/viewer/2022061515/5542eb74497959361e8dcde5/html5/thumbnails/13.jpg)
Un caso particolare
• Invece vorremmo che il collegamento fosse «al volo» ovvero dinamico, a tempo di esecuzione del programma
• Così magari la macchina si accorge che si tratta di un Gatto e non di un Felino generico
![Page 14: Andrea Zoccheddu Oggetti in C# Lezione 5 Polimorfismo I](https://reader033.vdocuments.site/reader033/viewer/2022061515/5542eb74497959361e8dcde5/html5/thumbnails/14.jpg)
Andrea Zoccheddu
polimorfismopolimorfismo
OVERRIDINGOVERRIDING
I METODI VIRTUALII METODI VIRTUALI
![Page 15: Andrea Zoccheddu Oggetti in C# Lezione 5 Polimorfismo I](https://reader033.vdocuments.site/reader033/viewer/2022061515/5542eb74497959361e8dcde5/html5/thumbnails/15.jpg)
OVERRIDINGOVERRIDING
La situazione si può risolvere cosìclass Felino{
public virtual void Fusa (){Console.WriteLine("Grrr");}
public void Contento(){Fusa();Console.WriteLine("Struscia");}
}//Felino
class Gatto : Felino{
public override void Fusa (){Console.WriteLine("Prrr");}
}//Gatto
il metodo Contento è ereditato
![Page 16: Andrea Zoccheddu Oggetti in C# Lezione 5 Polimorfismo I](https://reader033.vdocuments.site/reader033/viewer/2022061515/5542eb74497959361e8dcde5/html5/thumbnails/16.jpg)
Un caso particolare
Quando si invocano i metodi essi si comportano bene:
Cosa accade?Il collegamento al metodo Fusa è ritardato: si aspetta l’esecuzione della invocazione per decidere quale metodo invocare
Felino f1 = new Felino(); f1.Contento();
Gatto g1 = new Gatto();g1. Contento();
GRRRStruscia
PRRRStruscia
![Page 17: Andrea Zoccheddu Oggetti in C# Lezione 5 Polimorfismo I](https://reader033.vdocuments.site/reader033/viewer/2022061515/5542eb74497959361e8dcde5/html5/thumbnails/17.jpg)
polimorfismo• Il polimorfismo è il concetto che
una istanza può invocare un nome di metodo che si aggancia dinamicamente al metodo corretto «al volo»
• Il polimorfismo è un paradigma di programmazione, ovvero un modello ed una tecnica di realizzazione dei programmi
• Rappresenta un modello elevato di efficienza e flessibilità
![Page 18: Andrea Zoccheddu Oggetti in C# Lezione 5 Polimorfismo I](https://reader033.vdocuments.site/reader033/viewer/2022061515/5542eb74497959361e8dcde5/html5/thumbnails/18.jpg)
virtual
• virtual è una parola riservata• Un metodo virtual è dichiarato
come un metodo con collegamento ritardato
• Il metodo verrà cercato a partire dal tipo di istanza legata alla variabile effettiva che la invoca
• Il metodo può essere ridefinito con override
![Page 19: Andrea Zoccheddu Oggetti in C# Lezione 5 Polimorfismo I](https://reader033.vdocuments.site/reader033/viewer/2022061515/5542eb74497959361e8dcde5/html5/thumbnails/19.jpg)
virtual
• L’ordine in cui compaiono le parole public e virtual non è importante.
• Una funzione virtuale non può essere privata, o si ha un errore di compilazione.
• Infatti una funzione privata non può essere visibile e accessibile dalle classe derivate
![Page 20: Andrea Zoccheddu Oggetti in C# Lezione 5 Polimorfismo I](https://reader033.vdocuments.site/reader033/viewer/2022061515/5542eb74497959361e8dcde5/html5/thumbnails/20.jpg)
override• override è una parola riservata• Un metodo override indica come
eseguire il metodo nel caso di una istanza specifica
• Un metodo virtuale deve essere ridefinito con override per ottenere un collegamento dinamico
• Se uso di nuovo virtual invece sto scavalcando il metodo
![Page 21: Andrea Zoccheddu Oggetti in C# Lezione 5 Polimorfismo I](https://reader033.vdocuments.site/reader033/viewer/2022061515/5542eb74497959361e8dcde5/html5/thumbnails/21.jpg)
override
• Una funzione con override deve fare riferimento ad una antenata virtuale o si ha un errore
• Il prototipo della funzione ridefinita deve coincidere perfettamente con quello della funzione base (public, tipo, parametri) o si ha un errore