Oggetti in C#
Lezione 4
Ereditarietà
II
Oggetti in C# - Lezione 4
Overload di metodi
nella stessa classe
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 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
• 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 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
• 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)
{…}
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 e classi
derivate
Invocare metodi da metodi
class Veicolo {
public int velocità;
public void Frena(int x)
{
if (velocità > 0)
velocità = velocità - x;
}
Un metodo può
public bool Frena()
{
if (velocità == 0)
return false;
metodo della stessa
else Frena (1);
classe
}
}
invocare un
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)
{
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 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 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 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à > 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à = 1;
}//costruttore
public void Mostra()
{
Console.WriteLine(età);
}
}//Felino
class Gatto : Felino
{
string razza;
public Gatto()
{
razza = "persiano";
}//costruttore
public void Mostra()
{
base.Mostra();
}
}//Gatto
Gatto g1 = new Gatto();
g1.Mostra();
Questa invocazione
rende 1
Esempio
class Figura
class Quadrato : Figura
{
{
int lato;
int lato;
public Figura (int lato)
public Quadrato (int lato)
{
{ //chiama implicitamente Figura()
this.lato = lato;
this.lato = lato;
}
}
public Figura()
public Quadrato() : this(1)
{
{
this.lato = 1;
}
}
public void Lato()
public void Lato()
{
{
base.Lato();
Console.WriteLine(lato);
}
}
}
}