2010-01-30 29 views
10

OK - to może być bardzo głupie pytanie, ale mnie to niepokoi.Polimorfizm według parametru funkcji

Czy istnieje język gdzie

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); 

przyniesie "doing ape stuff"? (proszę o zachowanie mnie przy użyciu składni C++) Aby wyjaśnić, chcę "funkcję, która akceptuje argument i działa zgodnie z rodzajem argumentu".

I czy miałoby to sens? Oczywiście, jako programista musisz zachować ostrożność, ponieważ instancje, które wyglądają tak, jak wskaźnik Animal mogą wywoływać kod Ape, ponieważ w czasie wykonywania jest to wskazana instancja Ape.

Odpowiedz

7

Tak, są! Nazywa się to multiple dispatch. Artykuł w Wikipedii jest bardzo dobry. Niestety, wydaje się, że obsługiwane są jedynie rozszerzenia językowe dla najpopularniejszych języków, ale istnieje kilka (głównie ezoterycznych) języków, które obsługują je natywnie.

+0

Common LISP ... Dlaczego to niespodzianka (nie!);) Dziękujemy za wyjaśnienie terminu i link do Wikipedii! – msi

+0

Będę drugi wspólny seplenienie. – Demosthenex

+0

To prawie smutne, że trzeba zaklasyfikować go jako ezoteryczny: -p –

1

Potencjalnie, ale nie będzie to C++, ponieważ funkcje przeładowujące wyszukiwania w C++ są wykonywane w czasie kompilacji, a nie w środowisku wykonawczym, co byłoby tutaj wymagane. Wymagałoby to dynamicznego języka, który pozwala na podpowiedzi typu i przeciążanie.

+0

Cóż, wiem, że C++ nie obsługuje funkcji ja „jakoś” szukasz. Myśl przychodziła do mnie, kiedy kodowałem w C++. Czy to właśnie robi różnicę między dynamicznymi/statycznymi językami? – msi

+0

Tak. Języki dynamiczne wykonują sprawdzenia typu/wyszukiwania atrybutów w środowisku wykonawczym zamiast w czasie kompilacji. Spowalnia nieco ich działanie, ale pozwala na większą elastyczność. –

+0

Nie, nie nie - możesz mieć bardzo dynamiczny język (powiedzmy Python), który nie obsługuje tego po wyjęciu z pudełka ... musisz użyć specjalnego dodatku "multimethods". –

1

Istnieje pewna niekonsekwencja, która jest myląca. Czy chcesz funkcję, która akceptuje argument i działa na nim zgodnie z rodzajem argumentu? To nie byłby polimorfizm, ponieważ funkcje są na ich samotności, nie są to metody należące do hierarchii klas lub interfejsów. Innymi słowy, jego rodzaj polega na mieszaniu paradygmatów OO z paradygmatami proceduralnymi.

Jeśli jest to typ, który chcesz parametryzować, a nie zmienną, możesz użyć czegoś takiego jak Java Generics. W przypadku generycznych można poinformować metodę, że typ wprowadzanego parametru również będzie zmienny. Metoda działa na typ zmiennej w sposób ogólny.

+0

Dobry opis funkcji, której szukam - byłam tak odważna, aby umieścić ją w edycji mojego problemu. Masz rację - polimorfizm prawdopodobnie jest złym terminem, ale żaden inny nie natknął się na mój umysł. – msi

1

Open Multi-Methods for C++, autor: Peter Pirkelbauer, Yuriy Solodkyy i Bjarne Stroustrup.

W tym artykule omówiono rozszerzenie języka w celu zintegrowania wielu metod w języku C++ oraz kilka bardzo interesujących szczegółów implementacji, takich jak obsługa dynamicznie ładowanych bibliotek i rzeczywisty układ do prawidłowego wysyłania. Zauważ, że nie jest jeszcze częścią standardu C++ i prawdopodobnie nie jest częścią większego kompilatora.

7

Spójrz na Visitor pattern

+0

Dla języków, które nie obsługują wielokrotnego wysyłania i/lub dopasowywania wzorców Wzór użytkownika jest prawdopodobnie najlepszym rozwiązaniem. – Evan