En términos de Java, cuando alguien pregunta:
¿Qué es el polimorfismo?
¿Podría sobrecargar o anulando sería una respuesta aceptable?
Creo que hay algo más que eso.
SI tuvo una clase base abstracta que definió un método sin implementación, y definió ese método en la subclase, ¿eso todavía se anula?
Creo que la sobrecarga no es la respuesta correcta con seguridad.
java
oop
polymorphism
overloading
overriding
Brian G
fuente
fuente
Respuestas:
La forma más clara de expresar el polimorfismo es a través de una clase base abstracta (o interfaz)
Esta clase es abstracta porque el
goPee()
método no es definible para los humanos. Solo se puede definir para las subclases Masculino y Femenino. Además, Humano es un concepto abstracto: no se puede crear un ser humano que no sea Hombre ni Mujer. Tiene que ser uno u otro.Entonces aplazamos la implementación usando la clase abstracta.
y
Ahora podemos decirle a toda una habitación llena de humanos que orinen.
Ejecutar esto produciría:
fuente
goPee
no toma un campo gravitacional como entrada. Esta dependencia del estado globalCatheterizedIntersexAstronaut
dificulta las pruebas unitarias y muestra que la subclasificación puede no ser siempre el mejor método para la composición de rasgos.Polimorfismo es la capacidad de una instancia de clase de comportarse como si fuera una instancia de otra clase en su árbol de herencia, la mayoría de las veces una de sus clases ancestrales. Por ejemplo, en Java todas las clases heredan de Object. Por lo tanto, puede crear una variable de tipo Objeto y asignarle una instancia de cualquier clase.
Un anulaciónes un tipo de función que ocurre en una clase que hereda de otra clase. Una función de anulación "reemplaza" una función heredada de la clase base, pero lo hace de tal manera que se llama incluso cuando una instancia de su clase pretende ser un tipo diferente a través del polimorfismo. En referencia al ejemplo anterior, puede definir su propia clase y anular la función toString (). Dado que esta función se hereda de Object, seguirá estando disponible si copia una instancia de esta clase en una variable de tipo Object. Normalmente, si llama a toString () en su clase mientras finge ser un Object, la versión de toString que realmente se activará es la que se define en el Object. Sin embargo, debido a que la función es una anulación, la definición de toString () de su clase se usa incluso cuando la instancia de clase '
La sobrecarga es la acción de definir múltiples métodos con el mismo nombre, pero con diferentes parámetros. No está relacionado ni con la anulación ni con el polimorfismo.
fuente
Ad hoc polymorphism
es lo que describiste en tu sección Sobrecarga y es un caso de polimorfismo.Polimorfismo significa más de una forma, el mismo objeto realiza diferentes operaciones de acuerdo con el requisito.
El polimorfismo se puede lograr usando dos formas, esas son
La sobrecarga de métodos significa escribir dos o más métodos en la misma clase usando el mismo nombre de método, pero los parámetros de paso son diferentes.
La anulación del método significa que usamos los nombres de los métodos en las diferentes clases, lo que significa que el método de la clase primaria se usa en la clase secundaria.
En Java para lograr el polimorfismo, una variable de referencia de superclase puede contener el objeto de subclase.
Para lograr el polimorfismo, cada desarrollador debe usar los mismos nombres de método en el proyecto.
fuente
Aquí hay un ejemplo de polimorfismo en pseudo-C # / Java:
La función Main no conoce el tipo de animal y depende del comportamiento de una implementación particular del método MakeNoise ().
Editar: Parece que Brian me ganó el golpe. Es curioso que utilizamos el mismo ejemplo. Pero el código anterior debería ayudar a aclarar los conceptos.
fuente
Tanto la anulación como la sobrecarga se utilizan para lograr el polimorfismo.
Podría tener un método en una clase que se anule en una o más subclases. El método hace cosas diferentes dependiendo de qué clase se usó para instanciar un objeto.
También podría tener un método que esté sobrecargado con dos o más conjuntos de argumentos. El método hace cosas diferentes en función del tipo (s) de argumento (s) pasado (s).
fuente
Tienes razón en que la sobrecarga no es la respuesta.
Ninguno de los dos es primordial. La anulación es el medio por el cual se obtiene el polimorfismo. El polimorfismo es la capacidad de un objeto para variar el comportamiento en función de su tipo. Esto se demuestra mejor cuando la persona que llama de un objeto que exhibe polimorfismo no es consciente de qué tipo específico es el objeto.
fuente
Específicamente decir sobrecarga o anulación no da la imagen completa. El polimorfismo es simplemente la capacidad de un objeto para especializar su comportamiento en función de su tipo.
No estaría de acuerdo con algunas de las respuestas aquí en que la sobrecarga es una forma de polimorfismo (polimorfismo paramétrico) en el caso de que un método con el mismo nombre pueda comportarse de manera diferente, dando diferentes tipos de parámetros. Un buen ejemplo es la sobrecarga del operador. Puede definir "+" para aceptar diferentes tipos de parámetros, digamos cadenas o int, y en función de esos tipos, "+" se comportará de manera diferente.
El polimorfismo también incluye métodos de herencia y anulación, aunque pueden ser abstractos o virtuales en el tipo base. En términos de polimorfismo basado en herencia, Java solo admite herencia de clase única limitando su comportamiento polimórfico al de una sola cadena de tipos base. Java admite la implementación de múltiples interfaces, que es otra forma de comportamiento polimórfico.
fuente
El polimorfismo simplemente significa "muchas formas".
No REQUIERE herencia para lograr ... ya que la implementación de la interfaz, que no es herencia en absoluto, satisface las necesidades polimórficas. Podría decirse que la implementación de la interfaz satisface las necesidades polimórficas "Mejor" que la herencia.
Por ejemplo, ¿crearías una superclase para describir todas las cosas que pueden volar? Debería pensar que no. Sería mejor para usted crear una interfaz que describa el vuelo y dejarlo así.
Entonces, dado que las interfaces describen el comportamiento, y los nombres de los métodos describen el comportamiento (para el programador), no es demasiado difícil considerar la sobrecarga del método como una forma menor de polimorfismo.
fuente
El ejemplo clásico, los perros y los gatos son animales, los animales tienen el método makeNoise. Puedo iterar a través de una serie de animales llamando a makeNoise sobre ellos y esperar que hagan la implementación respectiva.
El código de llamada no tiene que saber qué animal específico son.
Eso es lo que yo pienso como polimorfismo.
fuente
El polimorfismo es la capacidad de un objeto de aparecer en múltiples formas. Esto implica el uso de la herencia y las funciones virtuales para construir una familia de objetos que pueden intercambiarse. La clase base contiene los prototipos de las funciones virtuales, posiblemente no implementadas o con implementaciones predeterminadas según lo dicte la aplicación, y las diversas clases derivadas las implementan de manera diferente para afectar diferentes comportamientos.
fuente
Ninguno:
La sobrecarga es cuando tienes el mismo nombre de función que toma parámetros diferentes.
La anulación es cuando una clase secundaria reemplaza el método de un padre por uno propio (esto en sí mismo no constituye polimorfismo).
El polimorfismo es un enlace tardío, por ejemplo, se llama a los métodos de la clase base (padre), pero no hasta que el tiempo de ejecución sepa cuál es el objeto real; puede ser una clase secundaria cuyos métodos son diferentes. Esto se debe a que cualquier clase secundaria se puede usar donde se define una clase base.
En Java, se ve mucho el polimorfismo con la biblioteca de colecciones:
La lista es la clase base, el compilador no tiene idea si está contando una lista vinculada, un vector, una matriz o una implementación de lista personalizada, siempre que actúe como una Lista:
Si estuvieras sobrecargando tendrías:
y el compilador seleccionaría la versión correcta de countStuff () para que coincida con los parámetros.
fuente
Aunque, el polimorfismo ya se explica con gran detalle en esta publicación, pero me gustaría poner más énfasis en por qué parte de él.
Intentemos crear una aplicación simple para un televisor con y sin herencia / polimorfismo. Publicar cada versión de la aplicación, hacemos una pequeña retrospectiva.
Supongamos que usted es ingeniero de software en una compañía de TV y se le pide que escriba software para controladores de volumen, brillo y color para aumentar y disminuir sus valores en el comando del usuario.
Comienza escribiendo clases para cada una de estas características agregando
Ahora tiene nuestra primera versión de la aplicación de trabajo lista para ser implementada. Tiempo para analizar el trabajo realizado hasta ahora.
Decide vivir con eso siempre que su aplicación funcione como se espera.
Comienza a escribir una nueva clase (ResetFunctionV2) para la nueva funcionalidad y asigna el código de asignación de entrada del usuario para esta nueva función.
Entonces tiene su aplicación lista con la función Restablecer. Pero ahora empiezas a darte cuenta de que
Ahora comienza a pensar que esta nueva característica que se agregará se asemeja a la función Restablecer y los problemas de la aplicación (V2) se multiplicarán si no vuelve a factorizar su aplicación.
Comienza a pensar en usar la herencia para poder aprovechar la capacidad polimórfica de JAVA y agrega una nueva clase abstracta (ControllerV3) a
Con estas mejoras, tiene lista la versión 3 de su aplicación de TV.
Aunque la mayoría de los problemas enumerados en la lista de problemas de V2 se abordaron, excepto
Nuevamente, piensa en resolver este problema, ya que ahora también tiene que implementar otra característica (actualización del controlador al inicio). Si no lo arregla, también se replicará a nuevas características.
Entonces divide el contrato definido en la clase abstracta y escribe 2 interfaces para
Y haga que su primera clase concreta los implemente de la siguiente manera
Espero que esto ayude :-)
fuente
El término sobrecarga se refiere a tener múltiples versiones de algo con el mismo nombre, generalmente métodos con diferentes listas de parámetros
Por lo tanto, estas funciones pueden hacer lo mismo, pero tiene la opción de llamarlo con una ID o un nombre. No tiene nada que ver con herencia, clases abstractas, etc.
La anulación generalmente se refiere al polimorfismo, como describiste en tu pregunta
fuente
sobrecarga es cuando define 2 métodos con el mismo nombre pero diferentes parámetros
la anulación es donde cambia el comportamiento de la clase base a través de una función con el mismo nombre en una subclase.
Entonces, el polimorfismo está relacionado con la anulación, pero no con la sobrecarga.
Sin embargo, si alguien me dio una respuesta simple de "anulación" para la pregunta "¿Qué es el polimorfismo?" Yo pediría más explicaciones.
fuente
anular es más como ocultar un método heredado al declarar un método con el mismo nombre y firma que el método de nivel superior (súper método), esto agrega un comportamiento polimórfico a la clase. en otras palabras, la decisión de elegir qué método de nivel se llamará se tomará en tiempo de ejecución, no en tiempo de compilación. Esto lleva al concepto de interfaz e implementación.
fuente
Del tutorial de java
La definición del diccionario de polimorfismo se refiere a un principio en biología en el que un organismo o especie puede tener muchas formas o etapas diferentes. Este principio también se puede aplicar a la programación orientada a objetos y lenguajes como el lenguaje Java. Las subclases de una clase pueden definir sus propios comportamientos únicos y, sin embargo, compartir algunas de las mismas funciones de la clase principal.
Al considerar los ejemplos y la definición, anular debe aceptar la respuesta.
Con respecto a su segunda consulta:
Debería llamarse anulación.
Eche un vistazo a este ejemplo para comprender los diferentes tipos de anulación.
super.methodName()
primera instrucciónfragmento de código:
salida:
fuente
Creo que ustedes están mezclando conceptos. El polimorfismo es la capacidad de un objeto de comportarse de manera diferente en el tiempo de ejecución. Para lograr esto, necesita dos requisitos:
Dicho esto, la sobrecarga significa algo diferente a la anulación dependiendo del idioma que esté utilizando. Por ejemplo, en Java no existe la anulación sino la sobrecarga . Los métodos sobrecargados con firma diferente a su clase base están disponibles en la subclase. De lo contrario, serían anulados (por favor, vea que quiero decir ahora el hecho de que no hay manera de llamar a su método de la clase base desde fuera del objeto).
Sin embargo, en C ++ eso no es así. Cualquier método sobrecargado , independientemente de si la firma es la misma o no (cantidad diferente, tipo diferente) también se anula . Es decir, el método de la clase base ya no está disponible en la subclase cuando se llama desde fuera del objeto de la subclase, obviamente.
Entonces la respuesta es cuando se habla de sobrecarga de uso de Java . En cualquier otro idioma puede ser diferente como sucede en c ++
fuente
El polimorfismo es más probable en lo que se refiere a su significado ... anular en Java
Se trata de diferentes comportamientos del mismo objeto en diferentes situaciones (en forma de programación ... puede llamar a diferentes ARGUMENTOS)
Creo que el siguiente ejemplo lo ayudará a comprender ... Aunque no es un código Java PURO ...
Pero si cambiamos el ARGUMENTO ... el COMPORTAMIENTO cambiará ...
La Persona (aquí el "Objeto") es la misma ...
fuente
El polimorfismo es una implementación múltiple de un objeto o podría decirse múltiples formas de un objeto. Digamos que tiene clase
Animals
como la clase base abstracta y tiene un método llamadomovement()
que define la forma en que se mueve el animal. Ahora, en realidad, tenemos diferentes tipos de animales y también se mueven de manera diferente, algunos de ellos con 2 patas, otros con 4 y algunos sin patas, etc. Para definir diferentesmovement()
animales en la tierra, necesitamos aplicar el polimorfismo. Sin embargo, debe definir más clases, es decir, clase,Dogs
Cats
Fish
etc. Luego, debe extender esas clases desde la clase baseAnimals
y anular su métodomovement()
con una nueva funcionalidad de movimiento basada en cada animal que tenga. También puedes usarInterfaces
para lograr eso. La palabra clave aquí es primordial, la sobrecarga es diferente y no se considera polimorfismo. con sobrecarga puede definir múltiples métodos "con el mismo nombre" pero con diferentes parámetros en el mismo objeto o clase.fuente
El polimorfismo se relaciona con la capacidad de un lenguaje de tener diferentes objetos tratados de manera uniforme mediante el uso de una sola interfaz; como tal, está relacionado con la anulación, por lo que la interfaz (o la clase base) es polimórfica, el implementador es el objeto que anula (dos caras de la misma medalla)
de todos modos, la diferencia entre los dos términos se explica mejor usando otros lenguajes, como c ++: un objeto polimórfico en c ++ se comporta como la contraparte de Java si la función base es virtual, pero si el método no es virtual, el salto de código se resuelve estáticamente , y el tipo verdadero no se verifica en tiempo de ejecución, por lo que el polimorfismo incluye la capacidad de un objeto de comportarse de manera diferente dependiendo de la interfaz utilizada para acceder a él; déjame hacer un ejemplo en pseudocódigo:
(suponiendo que makeRumor NO es virtual)
Java realmente no ofrece este nivel de polimorfismo (llamado también corte de objetos).
animal a = perro nuevo (); perro b = perro nuevo ();
en ambos casos solo imprimirá woff .. ya que ayb se refiere al perro de clase
fuente
fuente