Conceptos de programación orientada a objetos para principiantes: explicación del polimorfismo

Publicado: 2021-12-10

En lenguajes de alto nivel como Python y Java, OOP o programación orientada a objetos se refiere a la organización del diseño de software en torno a datos y objetos en lugar de lógica y funciones. Un objeto se define como un campo de datos con atributos y comportamiento únicos. En otras palabras, la programación orientada a objetos se centra en los objetos en lugar de la lógica. Tal modelo de programación es ideal para programas grandes y complejos que requieren actualizaciones y mantenimiento activos. Además, trae a la mesa los beneficios adicionales de escalabilidad, eficiencia y reutilización de código.

OOP tiene cuatro bloques de construcción fundamentales: polimorfismo, encapsulación, abstracción y herencia. Dado que el alcance de nuestro artículo se limita al polimorfismo en OOP, analizaremos el polimorfismo en detalle, incluidos ejemplos de polimorfismo en Java y polimorfismo en Python.

Aprenda cursos de software en línea de las mejores universidades del mundo. Obtenga programas Executive PG, programas de certificados avanzados o programas de maestría para acelerar su carrera.

Tabla de contenido

Definición de polimorfismo

La definición de polimorfismo más simple sería que polimorfismo significa existir en varias formas. Tiene sus raíces en dos términos griegos: 'poli', que significa 'numeroso' y 'morph', que se traduce como 'formas'.

Para entender mejor el concepto, primero tomemos un ejemplo simple. Tome el ejemplo del comportamiento del cursor, el mismo cursor que ve moverse en la pantalla cada vez que usa un mouse o un trackpad. Dependiendo de las acciones del usuario o del modo del programa, el cursor puede tomar diferentes formas, como una flecha, una cruz, una línea o un dedo índice.

El polimorfismo es una de las características más significativas de OOP. En Java y Python, las variables, los objetos y las funciones pueden existir en muchas formas. En el polimorfismo, una subclase o método define sus atributos y comportamientos mientras conserva algunas de las funcionalidades de su clase principal. Eso nos lleva a la herencia, que le permite crear jerarquías de clases donde una clase base otorga sus atributos y comportamiento a una clase derivada. Posteriormente, las funcionalidades de la clase derivada se pueden modificar o ampliar libremente según sea necesario. Con este fin, el polimorfismo asegura que se ejecute el método correcto según el tipo del objeto que llama.

Para ponerlo en perspectiva, suponga que tiene una clase que muestra la fecha y la hora. Ahora, crea un método que hereda la clase y muestra el mensaje "¡Hola!" junto con la fecha y la hora.

Ejemplo de polimorfismo en Java

Considere la superclase "Formas" que tiene un método "área ()". Las subclases en "Forma" pueden ser "Rectángulo", "Círculo", "Triángulo", etc., y cada subclase tiene su método para calcular el área. Aplicando los conceptos de herencia y polimorfismo, las subclases usan el método “área()” para encontrar la fórmula para calcular el área de la forma respectiva.

formas de clase {

área vacía pública () {

System.out.println(“La fórmula para el área de “);

}

}

clase Triángulo extiende Formas {

área vacía pública () {

System.out.println(“El triángulo es 1/2 * base * altura “);

}

}

clase Círculo extiende Formas {

área vacía pública () {

System.out.println(“El círculo mide 3,14 * radio * radio “);

}

}

clase principal {

public static void main(String[] args) {

Formas miForma = new Formas(); // Crear un objeto Formas

Formas myTriangle = new Triangle(); // Crea un objeto Triángulo

Formas myCircle = new Circle(); // Crear un objeto Círculo

miForma.area();

miTriángulo.area();

miForma.area();

miCirculo.area();

}

}

La salida del código de programa anterior será la siguiente:

la formula del area de un triangulo es 1/2 * base * altura

La fórmula para el área del círculo es 3.14 * radio * radio

Tipos de polimorfismo en OOP

El polimorfismo en OOP es de dos tipos: estático (polimorfismo en tiempo de compilación) y dinámico (polimorfismo en tiempo de ejecución).

1. Polimorfismo estático

En Java, la sobrecarga de métodos es el tipo más común de polimorfismo estático. Puede crear varios métodos del mismo nombre dentro de la misma clase pero con diferentes parámetros. Los conjuntos de parámetros deben diferir en al menos uno de los siguientes tres criterios:

  • Los métodos deben tener diferentes números de parámetros.
  • Los tipos de parámetros deben ser diferentes. Por ejemplo, si un método acepta Long, el otro acepta String.
  • Los métodos deben aceptar los parámetros en diferentes órdenes. Por ejemplo, si el método 1 acepta Long y String, el método dos debe aceptar String y luego Long.

En la sobrecarga de métodos, al llamar al método, el compilador elige a qué método llamar en función de los parámetros pasados ​​durante la llamada. Esto tiene lugar en tiempo de compilación y, por lo tanto, este tipo de polimorfismo también se conoce como polimorfismo en tiempo de compilación.

El siguiente es un ejemplo de código Java para mostrar el polimorfismo en tiempo de compilación. En este ejemplo, el método added () está sobrecargado con dos tipos diferentes de parámetros.

paquete polimorfismo estático;

Adición de clase pública

{

suma vacía (int x, int y)

{

intc = x+y;

System.out.println(“ Suma de dos números :” +c); }

suma vacía (int x, int y, int z)

{

int c = x+y+z;

System.out.println(“ Suma de tres números :” +c); }

public static void main(String[] args)

{

Adición obj = nueva Adición();

obj.suma ( 45,34);

obj.sum(60, 32, 11);

}

}

La salida del programa anterior será:

Suma de dos números: 79

Suma de tres números: 103

2. Polimorfismo dinámico

El polimorfismo dinámico o de tiempo de ejecución se logra mediante la anulación de métodos. Aquí, los métodos están en diferentes formas en diferentes clases (anulación de métodos), y en lugar de tiempo de compilación, la llamada a un método anulado se resuelve en tiempo de ejecución. Ahora, al asignar un objeto a una referencia de clase y llamar a un método, se ejecuta el método en la clase del objeto. Dado que el objeto se crea en tiempo de ejecución, la forma del método (en el objeto) que debe ejecutarse solo se decide en tiempo de ejecución.

El siguiente es un ejemplo de código Java para mostrar el polimorfismo en tiempo de ejecución . En el ejemplo, hay una superclase "Animal" y tres subclases, "canguro", "tigre" y "pez". Las subclases amplían la superclase y anulan su método "mover()". El método "mover ()" es llamado por la variable de referencia de la clase principal "Animal".

clase animal{

movimiento nulo(){

System.out.println(“Los animales se mueven”);

}

}

clase canguro extiende Animal{

movimiento nulo(){

System.out.println(“Los canguros saltan”);

}

}

clase tigre extiende Animal{

movimiento nulo(){

System.out.println(“Los tigres caminan”);

}

}

clase pescado extiende Animal{

movimiento nulo(){

System.out.println(“Nada de peces”);

}

}

clase principal{

public static void main(String args[]){

Animal A = nuevo Animal();

Animal k = nuevo canguro(); // upcasting

Animal t = nuevo tigre(); // upcasting

Animal f = pez nuevo(); // upcasting

Un movimiento();

k.mover();

t.mover();

f.mover();

}

}

La salida del programa anterior será:

Los animales se mueven

Salto de canguros

Los tigres caminan

Los peces nadan

Polimorfismo en Python

El polimorfismo en Python es de tres tipos: polimorfismo de operador, polimorfismo de función y polimorfismo de clase. Python también permite la anulación de métodos, pero no la sobrecarga de métodos.

1. Polimorfismo del operador

En Python, el operador '+' tiene un uso dual. Se utiliza para operaciones de suma aritmética en el caso de tipos de datos enteros, y para cadenas, el operador '+' realiza concatenaciones.

El siguiente es un ejemplo de código de Python donde el operador '+' realiza sumas en tipos de datos enteros:

número1 = 4

número2 = 5

imprimir(num1+num2)

La salida del código de programa anterior es '9.'

El siguiente es un ejemplo de código de Python donde el operador '+' realiza la concatenación en tipos de datos de cadena:

str1 = "Bien"

str2 = "Tarde"

imprimir(str1+” “+str2)

La salida del programa anterior será 'Buenas noches'.

2. Polimorfismo de funciones

La función 'len()' en Python es compatible con diferentes tipos de datos, como lista, cadena, tupla, diccionario y conjunto, pero devuelve información específica para cada tipo de datos. Aquí hay un ejemplo:

imprimir (len ("Programador"))

imprimir (len ([“Python”, “Java”, “C”]))

print(len({“Nombre”: “Kathy”, “Dirección”: “Texas”}))

El programa anterior tendrá el siguiente resultado:

9

3

2

3. Polimorfismo de clase

Extendiendo el concepto de polimorfismo, Python permite que múltiples clases tengan métodos con el mismo nombre. A continuación se muestra un ejemplo para mostrar el polimorfismo en los métodos de clase en Python. En el ejemplo, hay dos clases, 'Gato' y 'Perro'. Tienen una estructura similar y tienen los mismos nombres de método 'make_sound()' e 'info()'.

gato de clase:

def __init__(yo, nombre, edad):

self.nombre = nombre

self.edad = edad

def info(auto):

print(f”Soy un gato. Mi nombre es {self.name}. Tengo {self.age} años.”)

def hacer_sonido(uno mismo):

imprimir ("Miau")

perro de clase:

def __init__(yo, nombre, edad):

self.nombre = nombre

self.edad = edad

def info(auto):

print(f”Soy un perro. Mi nombre es {self.name}. Tengo {self.age} años.”)

def hacer_sonido(uno mismo):

imprimir ("ladrar")

gato1 = Gato(“Minnie”, 3)

perro1 = Perro(“Tom”, 6)

para animal en (cat1, dog1):

animal.hacer_sonido()

animal.info()

animal.hacer_sonido()

La salida será la siguiente:

maullar

Soy un gato. Mi nombre es Minnie. tengo 3 años

maullar

Ladrar

Yo soy un perro. Mi nombre es Tom. Tengo 6 años.

Ladrar

4. Anulación de métodos

Python también permite que las clases secundarias hereden atributos y métodos de la clase principal. Ciertos métodos y atributos se pueden redefinir para adaptarse a la clase secundaria (anulación de métodos). El polimorfismo luego permite el acceso a los métodos y atributos anulados con el mismo nombre que la clase principal.

El siguiente es un ejemplo de código de Python para ilustrar la anulación de métodos:

de importación matemática pi

forma de clase:

def __init__(uno mismo, nombre):

self.nombre = nombre

área def (auto):

pasar

hecho def (uno mismo):

volver “Soy una figura cerrada.”

def __str__(uno mismo):

volver self.name

clase Cuadrado (Forma):

def __init__(uno mismo, longitud):

super().__init__(“Cuadrado”)

self.longitud = longitud

área def (auto):

volver auto.longitud**2

hecho def (uno mismo):

devuelve "Cada ángulo en un cuadrado es igual a 90 grados".

círculo de clase (forma):

def __init__(auto, radio):

super().__init__(“Círculo”)

self.radius = radio

área def (auto):

devuelve pi*self.radius**2

a = Cuadrado(4)

b = Circulo(7)

imprimir (b)

imprimir (b. hecho ())

imprimir (un hecho ())

imprimir(b.área())

El programa anterior tendrá el siguiente resultado:

Circulo

Soy una figura cerrada.

Cada ángulo en un cuadrado es igual a 90 grados.

153.93804002589985

Obtenga más información sobre la anulación de métodos.

Ventajas del polimorfismo en OOPs

El polimorfismo en OOP tiene tres ventajas significativas. Son los siguientes:

  • El polimorfismo permite la reutilización del código. Por lo tanto, una vez que las clases se escriben, prueban e implementan, puede reutilizarlas una y otra vez. Además, el código se puede modificar sin afectar el código original. Todo esto ahorra un tiempo significativo para el codificador.
  • En el polimorfismo, se pueden almacenar múltiples valores de datos en una sola variable. Además, el valor de una variable heredado de una superclase a una subclase se puede modificar sin cambiar el valor de la variable en la superclase o cualquier subclase.
  • Finalmente, el polimorfismo funciona con menos líneas de código, lo que, a su vez, facilita la depuración para el programador.

camino a seguir

upGrad, en asociación con la prestigiosa Universidad John Moores de Liverpool, ofrece un riguroso programa de Maestría en Ciencias en Ciencia de Datos en línea para profesionales que aspiran a hacer una carrera en ciencia de datos. El curso finaliza con una maestría de LJMU y una certificación del Programa Ejecutivo PG de IIIT Bangalore.

Puntos destacados del programa:

  • Más de 500 horas de contenido, más de 60 estudios de casos y proyectos, más de 20 sesiones en vivo
  • Cobertura integral de más de 14 herramientas y software como Python, AWS, MySQL y más
  • Sesiones de coaching con expertos de la industria.
  • Aprendizaje entre pares y trabajo en red de la industria
  • Asistencia profesional de 360 ​​grados

UpGrad, una de las mejores plataformas de EdTech superior en la actualidad, continúa inspirando y preparando a los estudiantes a través de una combinación de tecnología de punta, la última pedagogía, asociaciones de la industria y una facultad de clase mundial.

Aprenda cursos de ciencia de datos en línea de las mejores universidades del mundo. Obtenga programas Executive PG, programas de certificados avanzados o programas de maestría para acelerar su carrera.

¿Por qué se usa el polimorfismo en los OOP?

En OOP, el polimorfismo es el método que realiza diferentes tareas en función de la clase del objeto que lo llama. Por lo tanto, se envía un mensaje a objetos de varias clases y cada objeto responde de acuerdo con las propiedades de la clase.

¿Qué es la sobrecarga de métodos en Java?

En Java, dos o más métodos con el mismo nombre pueden diferir en sus parámetros (diferentes tipos de parámetros, diferente número de parámetros o ambos). Dichos métodos se denominan métodos sobrecargados y la función se denomina sobrecarga de métodos.

¿Cuál es la diferencia entre sobrecargar y anular?

Cuando dos o más métodos en la misma clase tienen diferentes parámetros pero el mismo nombre, se llama sobrecarga. Por otro lado, la anulación es cuando la superclase y la clase secundaria tienen la misma firma de método (nombre y parámetros).