2010-01-30 35 views
10

Ok, questa potrebbe essere una domanda molto stupida, ma mi ha infastidito.Polimorfismo per parametro di funzione

Esiste un linguaggio in cui

class Animal; 
class Ape : public Animal 
{...} 

void doStuff(Animal* animalPtr) 
{ 
    cout << "doing animal stuff" << endl; 
} 

void doStuff(Ape* apePtr) 
{ 
    cout << "doing ape stuff" << endl; 
} 

Animal *ape = new Ape(); 
doStuff(ape); 

sarebbe cedere "doing ape stuff"? (per favore abbiate pazienza con me usando la sintassi C++) Per chiarire, voglio "una funzione che accetta un argomento e agisce su di esso in base al tipo dell'argomento".

E avrebbe senso? Ovviamente, come sviluppatore dovresti fare attenzione perché le istanze che assomigliano a un puntatore Animal potrebbero effettivamente chiamare codice Ape, perché in fase di esecuzione è indicata un'istanza Ape.

risposta

7

Sì, ci sono! Questo è chiamato multiple dispatch. L'articolo di Wikipedia è molto buono. Purtroppo, sembra essere supportato solo tramite estensioni di lingua per le lingue più diffuse, ma ci sono alcune lingue (per la maggior parte esoteriche) che lo supportano in modo nativo.

+0

LISP comune ... Perché è una sorpresa (non!);) Grazie per il chiarimento dei termini e il link di Wikipedia! – msi

+0

I'll second common lisp. – Demosthenex

+0

È quasi triste classificarlo come esoterico :-p –

1

Potenzialmente, ma non sarebbe C++ in quanto le funzioni di overloading delle ricerche in C++ vengono eseguite in fase di compilazione, non in runtime come sarebbe richiesto qui. Richiederebbe un linguaggio dinamico che permetta il suggerimento del tipo e l'overloading.

+0

Beh, so che C++ non supporta la funzionalità che sto "sorta" cercando. Il pensiero mi è venuto in mente durante la codifica in C++. È questo che fa la differenza tra i linguaggi dinamici/statici? – msi

+0

Sì. I linguaggi dinamici eseguono controlli di tipo/ricerche di attributi in fase di esecuzione anziché in fase di compilazione. Rallenta le loro operazioni un po ', ma consente una maggiore flessibilità. –

+0

No no no - puoi avere un linguaggio molto dinamico (ad esempio Python) che non supporta questo fuori dalla scatola ... devi usare un addon speciale "multimethods". –

1

C'è qualche incoerenza qui che è fonte di confusione. Vuoi una funzione che accetta un argomento e agisce su di esso in base al tipo di argomento? Questo non sarebbe il polimorfismo in quanto le funzioni sono sul loro solitario, non sono metodi appartenenti a una gerarchia di classi o interfacce. In altre parole, è come mescolare i paradigmi OO con i paradigmi procedurali.

Se è il tipo che si desidera parametrizzare e non la variabile, si utilizzerà qualcosa come Java Generics. Con i generici puoi informare un metodo che anche il tipo di parametro che arriva sarà variabile. Il metodo agisce sul tipo di variabile in modo generico.

+0

Bella descrizione della funzione che sto cercando - Ero così audace nel metterlo in una modifica del mio problema. Hai ragione, il polimorfismo è probabilmente un termine cattivo, ma nessun altro mi è venuto in mente. – msi

1

Open Multi-Methods for C++, di Peter Pirkelbauer, Yuriy Solodkyy e Bjarne Stroustrup.

Questo documento discute un'estensione del linguaggio per integrare i multi-metodi in C++ insieme ad alcuni dettagli di implementazione molto interessanti, come trattare con le librerie caricate dinamicamente e il layout effettivo per la distribuzione corretta. Si noti che non fa ancora parte dello standard C++ e probabilmente non fa parte di alcun compilatore principale.

7

Date un'occhiata al Visitor pattern

+0

Per le lingue che non supportano più dispatch e/o pattern matching, il pattern Visitor è probabilmente la soluzione migliore. – Evan