Con polimorfismo in generale si intende la capacità di qualcosa di assumere forme diverse. Nella programmazione ad oggetti per polimorfismo si intende la possibilità di ridefinire (con lo stesso nome) i metodi ereditati da una classe base.
Il polimorfismo è dunque strettamente legato al concetto di ereditarietà e può assumere due forme:
Abbiamo già incontrato più volte il concetto di overloading. Supponiamo per esempio di avere una classe ellisse così definita:
asseMag e asseMin rappresentano rispettivamente l'asse maggiore e l'asse minore dell'ellisse.
Supponiamo ora di voler derivare dalla precedente una classe cerchio:
Si noti che il metodo set è stato riscritto usando un solo parametro (il cerchio è infatti un caso particolare di ellisse con i due assi uguali).
Si tratta di un caso di overloading: il compilatore riconosce quale metodo invocare in base al numero dei parametri passati. Si noti che il metodo set della classe base ellisse continua a essere disponibile anche per la classe derivata cerchio.
Nell'overriding invece la classe derivata riscrive identicamente un metodo della classe base, con gli stessi parametri. Questo accadrebbe per esempio, nel caso precedente, se ridefinissimo il metodo set nel seguente modo:
Si noti che il parametro b viene semplicemente ignorato in questo caso. A parte l'opportunità o meno di questa scelta di programmazione, è interessante notare che con l'overriding il metodo della classe base non risulta più disponibile nella classe derivata in quanto viene mascherato dall'identico metodo della classe derivata.
Sito realizzato in base al template offerto da
http://www.graphixmania.it