2010-01-30 10 views
10

Ok, esta puede ser una pregunta muy estúpida, pero me ha estado molestando.Polimorfismo por parámetro de función

¿Existe un lenguaje donde

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

produciría "doing ape stuff"? (Por favor, tengan paciencia usando la sintaxis de C++) Para aclarar, quiero "una función que acepte un argumento y lo actúe de acuerdo con el tipo de argumento".

¿Y tendría sentido? Por supuesto, como desarrollador debe tener cuidado ya que las instancias que se parecen a un puntero Animal en realidad podrían llamar al código Ape, porque en el tiempo de ejecución se apunta a una instancia de Ape.

Respuesta

7

Sí, hay! Esto se llama multiple dispatch. El artículo de Wikipedia es muy bueno. Lamentablemente, parece que solo se admite a través de extensiones de idioma para la mayoría de los idiomas populares, pero hay algunos idiomas (la mayoría esotéricos) que lo admiten de forma nativa.

+0

LISP común ... ¿Por qué es una sorpresa (no!);) ¡Gracias por la aclaración del plazo y el enlace de Wikipedia! – msi

+0

Recordaré el ceceo común. – Demosthenex

+0

Es casi triste tener que clasificarlo como esotérico :-p –

1

Potencialmente, pero no sería C++ ya que las búsquedas de sobrecarga de funciones en C++ se realizan en tiempo de compilación, no en tiempo de ejecución, como sería necesario aquí. Requeriría un lenguaje dinámico que permita sugerencias y sobrecargas de tipo.

+0

Bueno, sé que C++ no soporta la característica de que estoy "sorta" buscando. Pensé que me vino a la mente cuando codifiqué en C++. ¿Esto es lo que hace la diferencia entre los lenguajes dinámicos/estáticos? – msi

+0

Sí. Los lenguajes dinámicos realizan sus comprobaciones de tipos/búsquedas de atributos en tiempo de ejecución en lugar de tiempo de compilación. Se ralentiza un poco su funcionamiento, pero permite una mayor flexibilidad. –

+0

No, no, no; puede tener un lenguaje muy dinámico (digamos Python) que no lo admite de fábrica ... debe usar un complemento especial "multimétodos". –

1

Hay una cierta inconsistencia aquí que es confusa. ¿Desea una función que acepte un argumento y actúe según el tipo de argumento? Esto no sería realmente polimorfismo, ya que las funciones están en su soledad, no son métodos que pertenecen a una jerarquía de clase o interfaz. En otras palabras, es un tipo de mezcla de paradigmas OO con paradigmas de procedimiento.

Si es el tipo que desea parametrizar y no la variable, usaría algo así como Java Generics. Con genéricos puede informar a un método que el tipo de parámetro que entra también será variable. El método actúa sobre el tipo de variable de forma genérica.

+0

Bonita descripción de la función que estoy buscando - Fui tan valiente para ponerla en una edición de mi problema. Tienes razón, el polimorfismo probablemente sea un término malo, pero no se me ocurrió ninguno. – msi

1

Open Multi-Methods for C++, por Peter Pirkelbauer, Yuriy Solodkyy y Bjarne Stroustrup.

Este artículo analiza una extensión de lenguaje para integrar métodos múltiples en C++ junto con algunos detalles de implementación muy interesantes, como tratar con bibliotecas cargadas dinámicamente y el diseño real para despachar adecuadamente. Tenga en cuenta que aún no forma parte del estándar C++, y probablemente no forma parte de ningún compilador importante.

7

Tome un vistazo a la Visitor pattern

+0

Para los idiomas que no admiten el envío múltiple y/o coincidencia de patrones Patrón de visitante es probablemente la mejor solución. – Evan