2011-10-12 13 views

risposta

35

Forse è più facile iniziare con un'analogia non computerizzata.

Considerate se avete detto a qualcuno di "Andare al negozio e comprare un po 'del vostro cibo preferito per la cena".

Se lo dicevi a un figlio di 14 anni, probabilmente andava in bicicletta al negozio, doveva pagare in contanti per il cibo e tu avresti mangiato la pizza per cena.

Se l'hai detto a tua moglie, probabilmente andrebbe al negozio, usa una carta per pagare il cibo e potresti mangiare invece il pollo Cordon Bleu con lo Chardonnay.

In un programma, le cose funzionano un po 'allo stesso modo: specifichi qualcosa a un livello relativamente astratto (vai al negozio e prendi la cena). Ogni oggetto fornisce la propria implementazione concreta su come implementarlo e, in molti casi, fornisce alcune variazioni esattamente su ciò che sta per fare (ad esempio, come le differenze negli alimenti preferiti sopra).

Naturalmente, quando si programma, la maggior parte richiede una specifica molto più dettagliata e non ambigua.L'idea generale rimane la stessa però. Per lo scenario sopra, potresti avere una classe base (o un'interfaccia) person che ha definito metodi come go to store e select favorite food e pay for purchase. Avresti quindi implementazioni come adult e teenager, ognuna delle quali ha definito il proprio metodo di andare al negozio, selezionare il cibo preferito e pagare per un acquisto. Questi metodi sarebbero polimorfici, perché ogni implementazione avrebbe il proprio modo di eseguire il comando di livello superiore che hai dato.

2

Il polimorfismo indica la possibilità di scegliere la funzione chiamata esatta in fase di esecuzione a seconda del contesto corrente.

Questo può essere fatto descrivendo una classe di interfaccia da cui deriveranno gli altri. Si può usare nel suo codice solo l'interfaccia invece di usare certe classi. Questo dà al programmatore la possibilità di scegliere la migliore implementazione per i suoi problemi.

Come esempio, è possibile utilizzare gli array. Potrebbero esserci due possibili due implementazioni, una quando un array è sparse (molti zeri) e uno quando l'array è pieno. Invece di usare una classe diretta, si definirà l'interfaccia della classe dell'array e quindi nel contesto scegliere la migliore implementazione. Vedere il seguente codice come un esempio (C++ stile) di una matrice intera:

class arrayInterface{ 
    ... 
    virtual int getElement(elementPosition)=0 
    ... 
} 

class sparseArray : public arrayInterface{ 
    ... 
    virtual int getElement(elementPosition){ 
     implementation 
    } 
    ... 
} 

class fullArray : public arrayInterface{ 
    ... 
    virtual int getElement(elementPosition){ 
     implementation 
    } 
    ... 
} 

main(){ 
    arrayInterface* array = new fullArray(); 
    // this uses now the implementation specified by fullArray 
    int element = array->getElement(10) 

    delete array; 
    array = new sparseArray 
    // this uses now the implementation specified by sparseArray 
    int element = array->getElement(10) 

} 
12

letteralmente, polimorfismo significa "avere molteplici forme". Nella programmazione, se una variabile può contenere più di un tipo di valore, allora è una sorta di polimorfismo. Se le funzioni possono elaborare più di un tipo di parametro, questo è anche polimorfismo.

I linguaggi orientati agli oggetti hanno il polimorfismo attraverso la gerarchia di classi: un riferimento a una classe di base o un'interfaccia può fare riferimento a più tipi di oggetto, purché tali altri tipi siano derivati ​​dalla base. Questo è chiamato polimorfismo del sottotipo.

La programmazione generica è un altro tipo di polimorfismo. Applicando i parametri ai tipi, lo stesso bit di codice può gestire più tipi di oggetto. Questo è chiamato polimorfismo parametrico.

L'overloading dell'operatore e il sovraccarico di metodi all'interno di una classe sono un altro tipo di polimorfismo, noto come polimorfismo ad hoc, poiché è meno sistematico del polimorfismo parametrico o sottotipo.

Problemi correlati