2011-10-12 17 views

Respuesta

35

Quizás sea más fácil comenzar con una analogía que no sea de computadora.

Considere si le dijo a alguien que "vaya a la tienda y compre algo de su comida favorita para la cena".

Si le contaras esto a un hijo de 14 años, probablemente iría en bicicleta a la tienda, tendría que pagar en efectivo por la comida, y tendrías pizza para la cena.

Si se lo dijera a su esposa, probablemente conduciría a la tienda, usaría una tarjeta para pagar la comida, y en su lugar podría estar comiendo pollo Cordon Bleu con Chardonnay.

En un programa, las cosas funcionan de la misma manera: se especifica algo en un nivel relativamente abstracto (ir a la tienda y cenar). Cada objeto proporciona su propia implementación concreta de cómo implementarlo y, en muchos casos, proporciona alguna variación en lo que va a hacer exactamente (por ejemplo, como las diferencias en los alimentos favoritos anteriores).

Por supuesto, cuando está programando, la mayoría requiere una especificación mucho más detallada y no ambigua.La idea general sigue siendo la misma sin embargo. Para el escenario anterior, es posible que tenga una clase base person (o interfaz) que define métodos como go to store y select favorite food y pay for purchase. Entonces tendría implementaciones de eso como adult y teenager, cada una de las cuales definía su propio método para ir a la tienda, seleccionar comida favorita y pagar por una compra. Esos métodos serían polimórficos, ya que cada implementación tendría su propia manera de llevar a cabo el comando de nivel superior que usted dio.

2

Polimorfismo significa la capacidad de elegir la función llamada exacta en tiempo de ejecución dependiendo del contexto actual.

Esto se puede hacer mediante la descripción de una clase de interfaz de donde derivarán los demás. Uno puede usar en su código solo la interfaz en lugar de usar ciertas clases. Esto le da al programador la capacidad de elegir la mejor implementación para sus problemas.

Como ejemplo uno puede usar matrices. Puede haber dos posibles dos implementaciones, una cuando una matriz es dispersa (muchos ceros) y una cuando la matriz está llena. En lugar de usar una clase directa, uno definiría la interfaz de la clase de matriz y luego, en el contexto, elegiría la mejor implementación. Ver el código siguiente como un ejemplo (C++ estilo) de una matriz de enteros:

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

Literalmente, el polimorfismo significa "tener múltiples formas". En la programación, si una variable puede contener más de un tipo de valor, entonces ese es un tipo de polimorfismo. Si las funciones pueden procesar más de un tipo de parámetro, eso también es polimorfismo.

Los lenguajes orientados a objetos tienen polimorfismo a través de la jerarquía de clases: una referencia a una clase base o interfaz puede referirse a múltiples tipos de objetos, siempre que esos otros tipos se deriven de la base. Esto se llama polimorfismo de subtipo.

La programación genérica es otro tipo de polimorfismo. Al aplicar parámetros a los tipos, el mismo bit de código puede manejar múltiples tipos de objetos. Esto se llama polimorfismo paramétrico.

La sobrecarga del operador y la sobrecarga de métodos dentro de una clase son otro tipo de polimorfismo, conocido como polimorfismo ad hoc, porque es menos sistemático que el polimorfismo paramétrico o de subtipo.

Cuestiones relacionadas