Polimorfismo: definir en solo dos oraciones [cerrado]

85

He mirado otras definiciones y explicaciones y ninguna de ellas me satisface. Quiero ver si alguien puede definir el polimorfismo en como máximo dos oraciones sin usar ningún código o ejemplo. No quiero escuchar 'Entonces tienes una persona / automóvil / abrelatas ...' o cómo se deriva la palabra (a nadie le impresiona que sepas lo que significa poli y morph). Si tienes una buena comprensión de lo que es el polimorfismo y tienes un buen dominio del inglés, entonces deberías poder responder a esta pregunta en una definición breve, aunque densa. Si su definición define con precisión el polimorfismo pero es tan densa que requiere un par de lecturas, eso es exactamente lo que estoy buscando.

¿Por qué solo dos oraciones? Porque una definición es corta e inteligente. Una explicación es larga y contiene ejemplos y código. Busque aquí las explicaciones (la respuesta en esas páginas no es satisfactoria para mi pregunta):

Polimorfismo vs anulación vs sobrecarga
Trate de describir el polimorfismo lo más fácil que pueda

¿Por qué hago esta pregunta? Porque me hicieron la misma pregunta y descubrí que no pude encontrar una definición satisfactoria (según mis estándares, que son bastante altos). Quiero ver si alguna de las grandes mentes de este sitio puede hacerlo.

Si realmente no puede cumplir con el requisito de dos oraciones (es un tema difícil de definir), entonces está bien si lo pasa. La idea es tener una definición que realmente defina qué es el polimorfismo y no explique qué hace o cómo usarlo (¿entiendes la diferencia?).

Mark Testa
fuente
Un nombre, implementación múltiple.
Prosunjit Biswas el
2
Me hicieron esta pregunta en una entrevista de trabajo. Sentí que preguntarlo en una entrevista de trabajo era un acto elitista de esnobismo, el tipo de cosas que un empleado de Google preguntaría con aire de suficiencia suponiendo que nadie pudiera responderlo de manera eficaz. Si no consiguió el trabajo porque no pudo responder, probablemente sea mejor que trabaje para personas que están más interesadas en lo que puede hacer en lugar de en quién puede burlar.
MagicLAMP
El polimorfismo es un concepto muy importante de comprender en el desarrollo. Recomiendo encarecidamente al menos comprender su valor, si no la definición formal. Sugiero ser capaz de explicar al menos cómo funciona el patrón de estrategia y su valor.
Chad Johnson

Respuestas:

106

El polimorfismo permite la expresión de algún tipo de contrato, con potencialmente muchos tipos implementando ese contrato (ya sea a través de herencia de clase o no) de diferentes formas, cada una de acuerdo con su propio propósito. El código que utiliza ese contrato no debería (*) tener que preocuparse por la implementación involucrada, solo que el contrato se cumplirá.

(*) En el caso ideal, de todos modos, ¡obviamente, con bastante frecuencia, el código de llamada ha elegido la implementación adecuada muy deliberadamente!

Jon Skeet
fuente
1
Mark, ¿en algún momento aceptó esta respuesta y luego la rechazó? Estoy tratando de resolver lo que parece un error en el sistema de reputación; esta respuesta me ha dado una reputación neta de -15 para hoy, por extraño que parezca.
Jon Skeet
Lo mismo aquí, Jon: ahora he aceptado 2 respuestas con -15 rep. No es que me importe, pero es intrigante.
Otávio Décio
3
Estrictamente hablando, no hay ningún requisito de que "un tipo exprese algún tipo de contrato". Todo lo que realmente se requiere es que múltiples implementaciones puedan responder al mismo mensaje sin que el remitente del mensaje necesite saber o preocuparse por qué implementación está manejando el mensaje.
Doug Knesek
3
@Doug: Si no hay ningún contrato, ni siquiera implícito a través de la documentación o el nombre, ¿cómo diablos sabes que va a hacer lo que quieres? Hablas de una "interfaz" en tu propia respuesta, que me suena mucho a un contrato, ¿cuál crees que es la diferencia? Tanto "interfaz" como "contrato" son palabras que se pueden usar en un sentido "fuerte" (por ejemplo, imponerse en tiempo de compilación) o muy libremente (por ejemplo, mediante la convención de nomenclatura y el uso de tipificación dinámica).
Jon Skeet
1
@Alex: Sí, esa sería una edición que revertiría; prefiero mi redacción. Sin embargo, siempre puede agregar su propia respuesta.
Jon Skeet
72

La fruta se puede comer, por regla general, pero los diferentes tipos de fruta se consumen de diferentes formas. Una manzana, que es una fruta, se puede comer (porque es una fruta). También se puede comer un plátano (porque también es una fruta), pero de forma diferente a una manzana. Primero lo pelas.

Bueno, al menos lo hago, pero soy raro en algunos modales, así que, ¿qué sé yo?

Esto ilustra la herencia (la fruta se puede comer), el polimorfismo (algo que come fruta puede comer todo tipo de fruta) y la encapsulación (un plátano tiene piel).

En serio, la herencia de objetos, el polimorfismo, la encapsulación, las cosas virtuales, las cosas abstractas, las cosas privadas, las cosas públicas, todos estos son conceptos difíciles. Si alguien quiere tener una definición de 2 oraciones de esto, por favor marque la pregunta como una variante de código de golf, porque dos de esas oraciones tendrán que ser tan concisas que, a menos que sepa lo que es, no aprenderá lo suficiente. para saber sobre qué necesita aprender más.

Lasse V. Karlsen
fuente
lassevk: "a menos que ya sepas lo que es, no aprenderás lo suficiente como para saber qué necesitas aprender más" << Solo para aclarar, eso es lo que estoy esperando. Estoy buscando una definición que requiera pensar un poco para entenderla. Ninguno que se usaría para enseñar a un principiante.
Mark Testa
2
Entendí eso, acabo de publicar una respuesta algo humorística (para mí de todos modos) :) El polimorfismo y la programación orientada a objetos es una de esas cosas de pared grande, donde si grafica la curva de aprendizaje, simplemente golpea una pared grande y se arrastra sobre ella o no lo haces. Si es así, ¡por lo general tiene un gran AHA! experiencia ...
Lasse V. Karlsen
8
¡La cicuta también es una fruta! ¡Puedes comerlo pero solo una vez!
James Anderson
@JamesAnderson Entonces, ¿un singleton?
Lasse V. Karlsen
47

El polimorfismo es declarar una interfaz uniforme que no reconoce los tipos, dejando los detalles de implementación a tipos concretos que implementan la interfaz.

Eran Galperin
fuente
Esto es increíblemente conciso y creo que encaja perfectamente
Alex W
21

Wikipedia: el polimorfismo es una característica del lenguaje de programación que permite manejar valores de diferentes tipos de datos utilizando una interfaz uniforme. Bastante sencillo para mí.

Otávio Décio
fuente
21

En realidad, existen múltiples formas de polimorfismo y existe bastante controversia al respecto; incluso puede ver profesores de informática que no pueden definirlo correctamente. Soy consciente de tres tipos:

  • polimorfismo ad-hoc (parece un pato y camina como un pato => es un pato). Se puede ver en Haskell y Python, por ejemplo.

  • polimorfismo genérico (donde un tipo es una instancia de algún tipo genérico). Se puede ver en C ++, por ejemplo (el vector de int y el vector de cadena tienen un tamaño de función miembro).

  • polimorfismo de subtipo (donde un tipo hereda de otro tipo). Puede verse en la mayoría de los lenguajes de programación OO (es decir, Triangle is a Shape).


fuente
2
+1 por mencionar que existen diferentes tipos de polimorfismo. Sin embargo, su definición de polimorfismo ad-hoc parece ser bastante diferente de la mencionada en en.wikipedia.org/wiki/Type_polymorphism . Esa página dice que hay 2 tipos (ad-hoc versus paramétrico), no 3, y también hace una distinción entre funciones polimórficas y tipos de datos polimórficos. Sus 3 tipos, hasta donde puedo determinar, corresponden a funciones polimórficas paramétricas, tipos de datos polimórficos paramétricos y funciones polimórficas ad-hoc, respectivamente.
Laurence Gonsalves
hola, ¿cuál es la diferencia entre "instancia de algún tipo genérico" y "hereda de otro tipo" estos parecen decir lo mismo?
Shanimal
@LaurenceGonsalves fwiw, el enlace proporcionado en el primer comentario apunta a tres tipos. El polimorfismo paramétrico se define como permitir que una función o un tipo de datos se escriba "genéricamente".
Shanimal
14

Realmente entiendo por qué haces esta pregunta. Entiendo el polimorfismo, pero estaba en una entrevista de trabajo y me pidieron que diera una definición breve y clara de polimorfismo. Como no podía dar una definición clara y corta, comencé a pensar en ello y aquí está mi definición:

La capacidad de los objetos de un tipo de tener la misma interfaz, pero una implementación diferente de esta interfaz.

Nikolay Traykov
fuente
10

Definición :

El polimorfismo es una palabra de $ 10 para una idea de $ 1: cuando pido que se haga algo, no me importa cómo se logre, siempre que el resultado final sea apropiado. Mientras el servicio se brinde correctamente, no me importa la implementación .

Discusión

Si bien se usa comúnmente en el desarrollo de software, especialmente en sistemas desarrollados siguiendo principios orientados a objetos, el polimorfismo es fundamentalmente un principio del mundo real y debe definirse en términos del mundo real, no tecnológicos.

Ejemplos

Cuando quiero hacer una llamada telefónica, levanto un teléfono, marco un número y hablo con la persona que está al otro lado. No me importa quién hizo el teléfono, qué tecnología utiliza, si es cableado, inalámbrico, móvil o VOIP, o si está en garantía.

Cuando quiero imprimir un documento, lo imprimo. No me importa el lenguaje de implementación, la marca de la impresora, el estilo de conexión, la elección de consumibles o la calidad del papel.

Bevan
fuente
5
suena como un ejemplo Encapsulationpara mí
Singleton
1
El polimorfismo, la encapsulación y la abstracción están estrechamente relacionados, aunque se centran en diferentes perspectivas. Las buenas abstracciones hacen que el polimorfismo sea más fácil de lograr, y una buena encapsulación ayuda a prevenir la "fuga" de detalles.
Bevan
10

Varias implementaciones de la misma interfaz.

Ejemplo: muchos modelos de teléfono implementan la interfaz de teclado numérico.

Doug Knesek
fuente
8

El polimorfismo es una estrategia orientada a objetos que se utiliza al diseñar modelos de objetos para ayudar a simplificar el código. En su núcleo, el polimorfismo es la capacidad de definir dos objetos similares pero diferentes, y luego tratar los dos objetos como si fueran iguales.

Ok, eso es difícil ...

JoshBerke
fuente
7

Solo pensé en agregar mi propia interpretación de lo que es el polimorfismo: muy genéricamente, el polimorfismo es el acto de proporcionar una única interfaz a entidades de diferentes tipos .

Eso es bastante genérico, pero esa es la única forma que se me ocurre de envolver los tres tipos de polimorfismos que conozco: ad hoc , paramétrico y subtipo . Entraré en más detalles a continuación y ordenaré los tipos de polimorfismo por nombre, alfabéticamente. Lo más probable es que el que le interesa sea el polimorfismo de subtipo , que es el último.

Polimorfismo ad hoc

El polimorfismo ad hoc es el acto de proporcionar múltiples implementaciones del mismo método para diferentes tipos de parámetros. En OOP , generalmente se conoce como sobrecarga de métodos . Por ejemplo:

public String format(int a) {
    return String.format("%2d", a);
}

public String format(Date a) {
    return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(a);
}

Ambos formatmétodos comparten una única interfaz , pero funcionan en entidades de diferentes tipos .

Polimorfismo paramétrico

El polimorfismo paramétrico es el acto de hacer que una clase (o método) funcione en un tipo que es en sí mismo un parámetro de la clase (o método). A menudo se lo conoce como genérico .

Por ejemplo, Java List[T]espera un parámetro Ten el momento de la instanciación, y este parámetro define el tipo de objeto resultante.

Tenga en cuenta para los puristas que estoy ignorando intencionalmente los tipos crudos, ya que siento que simplemente enturbiarían las aguas en este contexto.

List[String]y List[Date]comparten una única interfaz , pero funcionan (y son) de diferentes tipos .

Polimorfismo de subtipo

El polimorfismo de subtipo es probablemente lo que quiso decir inicialmente en su pregunta: es el acto de proporcionar una única interfaz a múltiples implementaciones del mismo tipo.

Para usar el ejemplo habitual: Animalproporciona un contrato que todas las implementaciones deben respetar. Doges un Animal, y como tal admite todas las operaciones que Animaldeclara. De acuerdo con el principio de sustitución de Liskov , esto le permite usar una instancia de Dogdonde Animalse espera una instancia de (pero no al revés).

Si Caty Dogson ambas subclases de Animal, entonces comparten una única interfaz, pero de hecho son tipos diferentes .

Me estoy yendo un poco por la tangente aquí, pero el polimorfismo de subtipo es (creo) el único que permite la anulación : el acto de redefinir el comportamiento de un método definido por una clase principal. Esto a menudo se confunde con la sobrecarga que, como vimos antes, es un tipo de polimorfismo y, de hecho, no necesita subclases (ni clases, en realidad).

Nicolás Rinaudo
fuente
Entonces, ¿qué pasa con el polimorfismo basado en interfaces?
siamak
@siamak ¿no es solo un tipo específico de polimorfismo de subtipo donde el tipo principal es completamente abstracto? ¿O te refieres a otra cosa?
Nicolas Rinaudo
Mi intención de interfaz es Interfaz como tipo de referencia que existe en lenguajes orientados a objetos, como este: Interfaz I1 {void M ();} Creo que hay tantas diferencias entre subtipo o polimorfismo basado en herencia y polimorfismo basado en interfaz . Porque existe una relación "Is-a" en el polimorfismo basado en herencia entre tipos, pero no existe tal cosa en el polimorfismo basado en interfaz. De hecho, un mismo comportamiento con diferentes implementaciones podría compartirse entre varios tipos (clases) diferentes
siamak
Debo admitir que estoy confundido, aparte de su enfoque un tanto balístico de la mayúscula, parece que su descripción de lo que llama polimorfismo basado en interfaz es precisamente la misma que mi descripción del polimorfismo de subtipo. Estoy seguro de que ve la diferencia, pero me temo que realmente no me queda claro.
Nicolas Rinaudo
Como puede ver, no hay relación entre el coche y el pájaro y la persona, pero pueden moverse a su manera. Hay una gran diferencia entre la clase abstracta y la interfaz y el uso de la interfaz no es lo mismo que el subtipo, por lo que, en mi opinión, el polimorfismo de herencia y el polimorfismo basado en la interfaz no son lo mismo y no son iguales. // es difícil, codificar en el segmento de comentarios //
siamak
6

Parece que las mejores definiciones se proporcionan aquí, así que permítanme agregar mis dos centavos , por favor, solo para otros observadores. Espero que pueda ayudar más.

Hay dos tipos de polimorfismo:

1. Compile-time (static) polymorphism or (ad hoc) polymorphism.

Eso es simplemente sobrecarga de método y sobrecarga de operador

2.  Run time or (dynamic) polymorphism.

El primer término se hereda de la terminología de Java y C ++.

Pero en la terminología de .NET , solo el segundo ( me refiero al polimorfismo en tiempo de ejecución ) se supone realmente como polimorfismo y simplemente se le llama polimorfismo .

Y hasta donde yo sé, hay tres métodos para implementar el polimorfismo ( tiempo de ejecución ) .

 1. Parametric polymorphism or simply the use of generics (templates in C++).

 2. Inheritance-based polymorphism or subtyping.

 3. Interface-based polymorphism.

Un ejemplo simple de polimorfismo basado en interfaz:

interface Imobile
{
    void Move();
}

class Person :Imobile
{
    public void Move() { Console.WriteLine("I am a person and am moving in my way."); }
}

class Bird :Imobile
{
    public void Move() { Console.WriteLine("I am a bird and am moving in my way."); }
}

class Car :Imobile
{
    public void Move() { Console.WriteLine("I am a car and am moving in my way."); }
}


class Program
{

    static void Main(string[] args)
    {
        // Preparing a list of objects
        List<Imobile> mobileList = new List<Imobile>();

        mobileList.Add(new Person());
        mobileList.Add(new Bird());
        mobileList.Add(new Car());

        foreach (Imobile mobile in mobileList)
        {
            mobile.Move();
        }

        // Keep the console open
        Console.WriteLine("Press any key to exit the program:");
        Console.ReadKey();
    }
}

Salida:

 I am a person and am moving in my way.
 I am a bird and am moving in my way.
 I am a car and am moving in my way.
 Press any key to exit the program:
siamak
fuente
Todavía no veo la diferencia que haces. Person, Bird y Car son subtipos de Imobile. La persona es un inmóvil, el pájaro es un inmóvil y el automóvil es un inmóvil. Si necesitara una variable de tipo Imobile, podría usar una instancia de Person, Bird o Car, todos escribirían check. Eso es precisamente lo que significa polimorfismo de subtipo.
Nicolas Rinaudo
Bird y Person y Car no son subtipos de Imobile, son implementadores de esa interfaz y "se dan cuenta" de esa interfaz a su manera. El término "subtipo" se usa ampliamente entre un tipo real y un subtipo real que se hereda de él. y en esta situación existe una relación "Es-a" entre ellos, por ejemplo, un perro es un subtipo de un mamífero.
siamak
desde el punto de vista del compilador, hacer referencia a una interfaz y usar las referencias es algo verdadero y correcto. / BUT / IT no es un concepto igual al subtipo en una relación de herencia. Y creo que llamar a los Implementadores de una interfaz como subtipos es muy incómodo y realmente no es cierto.
siamak
Un ejemplo de polimorfismo basado en herencia haría bien en exponer esta respuesta.
Marcelo Mason
5

El polimorfismo es una abstracción de codificación de software donde varias entidades subyacentes diferentes (generalmente datos, pero siempre nit) comparten una interfaz común que les permite verse y actuar de manera idéntica en tiempo de ejecución. Usamos esto como una técnica de desarrollo para imponer un comportamiento consistente en una amplia gama de instancias similares, pero no idénticas, con una implementación mínima absoluta, reduciendo así la expectativa de errores e inconsistencias.

Paul.

Paul W Homer
fuente
5

polimorfismo == clases múltiples + firmas del mismo método + comportamiento específico de la clase.

S. Lot
fuente
2

Las múltiples formas de un solo objeto se denominan polimorfismo.

milot
fuente
2

El polimorfismo es la capacidad de un objeto de aparecer y comportarse de manera diferente para la misma invocación. Ej: cada animal aparece y suena de manera diferente (cuando lo golpeas :))

Mallik
fuente
2

El polimorfismo es una característica de los lenguajes de programación que permite que un objeto sea tratado como una instancia de su supertipo.

TarkaDaal
fuente
Downvoter - ¿Podría explicar por qué?
TarkaDaal
1

Dar un solo nombre a un conjunto de operaciones análogas sobre diferentes tipos. Cuando se hace bien, la analogía es obvia, por ejemplo, "sumar" números aritméticamente y "sumar" cadenas por concatenación (que suma sus longitudes).

joel.neely
fuente
1

Esta es la definición que siempre he seguido:

Dos objetos son polimórficos (con respecto a un protocolo en particular) entre ellos, si ambos responden a los mismos mensajes con la misma semántica.

El polimorfismo se trata de mensajes, se trata de poder responder el mismo conjunto de mensajes con la misma semántica.

¿Si dos objetos PUEDEN responder a vacío? pero la semántica del mensaje es diferente, entonces ... no son polimórficos.

Claudio Acciaresi
fuente
1

El polimorfismo en el nivel inferior es la capacidad de invocar métodos definidos por los implementadores de una interfaz desde la instancia de la interfaz.

Igor Zevaka
fuente
1

El polimorfismo es una característica de programación que permite que un objeto tenga muchos tipos ('formas') y le permite tratarlo como cualquiera de esos tipos dependiendo de lo que necesite hacer sin saber o preocuparse por sus otros tipos.

Jeff Sternal
fuente
1

El polimorfismo es una funcionalidad del lenguaje que permite que el código algorítmico de alto nivel opere sin cambios en múltiples tipos de datos. Y la otra frase, para lo que fuera ... ;-P.

(Los tipos compatibles con C ++ se enumeran y contrastan en mi respuesta: polimorfismo en c ++ )

Tony Delroy
fuente
0

El concepto de polimorfismo se convirtió en un fenómeno últimamente. Aquí está la deriva real. Runtime define qué submétodo debe ser invocado por una referencia de una superclase. Ahora bien, ¿qué significa en la práctica? En realidad, no significa nada. Puede codificar simplemente sin polimorfismo. ¿Entonces por qué? Porque, si no tenemos el polimorfismo, tuvimos que memorizar todas las definiciones de funciones de subclase. El polimorfismo nos salva de esto en la práctica.

Puede definir una lista de la siguiente manera:

List list = new List();

pero si busca IList, puede beneficiarse de la interfaz como:

IList list = new List();

y use la IListreferencia libremente. Suponiendo IListque también se implementa en otra clase, puede usar métodos de esa clase desconocida a través de la IListreferencia nuevamente sin intentar recordar ese nombre de clase. Maravilloso, ¿no?

Ahora, viene más información valiosa:
Java es polimórfico por defecto, mientras que .NET y C ++ no lo son, en MS, debe declarar la función base virtual(y en la overridepalabra clave .NET ).

Además, hay 2 reglas integrales en polimorfismo. Una es la herencia (a través de la interfaz implícita o mediante la extensión de clases) y la otra es invalidante. Sin anular, el polimorfismo no existe. Tenga en cuenta que la sobrecarga de métodos (que siempre en una sola clase) es también un tipo de polimorfismo "minimalista".

jazziiilove
fuente
1
Eso es más de 2 oraciones.
Dangerous
0

Para una firma de método dada, se ejecutan diferentes implementaciones de métodos para clases diferentes, relacionadas jerárquicamente.

Paolo
fuente
0

El polimorfismo es la capacidad de usar diferentes clases que implementan una interfaz común (o extienden una clase base común) de una manera común, sin necesidad de ahora la implementación específica, y usando solo los métodos disponibles en la interfaz común.

Es decir: en Java, como ArrayList y LinkedList implementan List, si declaras una variable como List, siempre puedes realizar las operaciones permitidas en List, sin importar si tu variable fue instanciada como ArrayList o LinkedList.

GaRRaPeTa
fuente
0

Las entidades del mismo tipo (es decir, implementadas con la misma interfaz o derivadas de la misma clase) se comportan de diferentes maneras (bajo el mismo nombre de método).

paul paul
fuente
0

Creo que la implementación de métodos de la misma firma en diferentes clases (que tienen algún tipo de relación de herencia ya sea usando extendidos o implementados) es un método anulado y también polimorfismo porque de esta manera estamos logrando muchas formas de la misma firma de método.

anand
fuente
-2

Supongo que a veces los objetos se llaman dinámicamente. No está seguro de si el objeto sería un triángulo, cuadrado, etc. en un poli de forma clásica. ejemplo.

Entonces, para dejar todas esas cosas atrás, simplemente llamamos a la función de la clase derivada y asumimos que se llamará a la de la clase dinámica.

No te importaría si es un cuadrado, un triángulo o un rectángulo. Solo te preocupas por la zona. Por lo tanto, se llamará al método getArea dependiendo del objeto dinámico pasado.

Kapil D
fuente
-2

El polimorfismo es la capacidad de una función de adaptarse automáticamente para aceptar datos de entrada de diferentes tipos de datos. Puede 'Agregar' dos dobles '1.1' y '2.2' y obtener '3.3' o 'Agregar' dos cadenas "Stack" y "Overflow" y obtener "StackOverflow".

J-Dizzle
fuente
¿Por qué alguien anotó esto? ¡Esta es la 'respuesta literal' de la página web de National Instrument sobre polimorfismo!
J-Dizzle
-3

El polimorfismo es cuando diferentes objetos responden al mismo método de manera diferente. Por ejemplo, un automóvil se mueve en la carretera mientras una persona camina por la carretera. Son dos objetos que responden al mismo camino de diferente manera.

usuario2342589
fuente
En realidad, el polimorfismo ve instancias de diferentes clases como un tipo común, y ha sido capaz de usar los métodos declarados en este tipo común independientemente de cómo las diferentes clases implementan esos métodos.
GaRRaPeTa