oop - sencillos - ¿Cuál es la diferencia entre el polimorfismo y la tipificación del pato?
polimorfismo poo (4)
Dos tipos de polimorfismo
- Método de sobrecarga (Polimorfismo de tiempo de compilación).
- Anulación del método (Polimorfismo del tiempo de ejecución).
Método de sobrecarga: el mismo nombre de función y diferente tipo de datos se conoce como método de sobrecarga
Ejemplo:
int addTwovalues(int a, int b)
{ return (a+b)}
float addTwovalues(float a, float b)
{ return (a+b)}
Method overriding :- same function name and same data type but different Class
is known as Method overriding.
class a
{
virtual int addtwovalues()
{ // to do }
}
class b:a
{
override int addtwovalues()
{ // to do }
}
a obj=new a();
obj.addtwovalues();
b objb=new a();
objb.addtwovalues(); //run time Polymorphism
Estoy un poco confundido con los dos términos, esto es lo que sé:
El polimorfismo es la capacidad de un objeto de diferentes tipos para ser manejado por una interfaz común. Mientras se escribe pato, es un tipo de escritura dinámica que permite que los objetos de diferentes tipos respondan a los mismos métodos.
Por lo que entiendo, el polimorfismo tiene más que ver con la creación de una interfaz que se puede compartir entre diferentes clases. Y la tipificación de pato se refiere a la tipificación suelta que permitirá llamar a los métodos siempre que se encuentren en el receptor del mensaje.
¿Es esto correcto? Estoy bastante confundido con los dos, parecen relacionados pero no sé cuál es su relación. ¡Muchas gracias por adelantado!
Este es un ejemplo de polimorfismo en Python.
class Animal:
def __init__(self, name): # Constructor of the class
self.name = name
def talk(self): # Abstract method, defined by convention only
raise NotImplementedError("Subclass must implement abstract method")
class Cat(Animal):
def talk(self):
return ''Meow!''
class Dog(Animal):
def talk(self):
return ''Woof! Woof!''
animals = [Cat(''Missy''),
Cat(''Mr. Mistoffelees''),
Dog(''Lassie'')]
for animal in animals:
print animal
print animal.name + '': '' + animal.talk()
Este es un ejemplo para Duck Typing in Python.
class Duck:
def quack(self):
print("Quaaaaaack!")
def feathers(self):
print("The duck has white and gray feathers.")
def name(self):
print("ITS A DUCK NO NAME")
class Person:
def quack(self):
print("The person imitates a duck.")
def feathers(self):
print("The person takes a feather from the ground and shows it.")
def name(self):
print("John Smith")
def in_the_forest(duck):
duck.quack()
duck.feathers()
duck.name()
def game():
for element in [ Duck() , Person()]:
in_the_forest(element)
game()
- En el polimorfismo, vemos una subclase (
Cat
yDog
) heredada de la clase principal (Animal
) y que invalida el método Hablar. - En el caso de escritura de pato, no creamos una subclase, en su lugar se crea una nueva clase con el método que tiene el mismo nombre pero una función diferente.
Polimorfismo (en el contexto de la programación orientada a objetos) significa que una subclase puede anular un método de la clase base. Esto significa que un método de una clase puede hacer cosas diferentes en subclases. Por ejemplo: una clase Animal
puede tener un método talk()
y las subclases Dog
y Cat
of Animal
pueden permitir que el método talk()
emita diferentes sonidos.
Duck typing significa que el código simplemente aceptará cualquier objeto que tenga un método particular. Digamos que tenemos el siguiente código: animal.quack()
. Si el animal
objeto dado tiene el método al que queremos llamar, entonces estamos bien (no se necesitan requisitos de tipo adicionales). No importa si el animal
es en realidad un Duck
o un animal diferente, lo que también sucede con el curandero. Por eso se llama tipografía de pato: si parece un pato (por ejemplo, tiene un método llamado quack()
entonces podemos actuar como si ese objeto fuera un pato).
Entonces, ¿están relacionados? Son simplemente características separadas que puede tener un lenguaje de programación. Hay lenguajes de programación que tienen polimorfismo pero que no tienen tipificación de pato (como Java). También hay idiomas que tienen polimorfismo y tipificación de pato (como Python).
Respuesta corta:
La tipificación del pato es una forma de lograr el polimorfismo. Otra forma es mediante la escritura estática.
Respuesta larga:
Hay dos conceptos diferentes involucrados aquí, mecanografía y técnica de programación.
Escribir pato es un tipo de escritura. Y escribir significa cuándo lanzar un error cuando se pasa un objeto no es lo que se espera. La escritura de pato es un tipo de escritura donde se produce un error cuando el programa se está ejecutando y el método al que se llama no está disponible. La escritura estática viene con la verificación del tiempo de compilación, por lo que si la información de tipo no coincide, generará un error cuando compile el código. Y eso es teclear.
El polimorfismo es una técnica de programación en la que permite que múltiples tipos de objetos cumplan ciertas responsabilidades. Puede hacerlo utilizando un tipo base para representar todos los tipos de clase secundarios. Puede utilizar la escritura de pato para representar todos los diferentes tipos que tienen los métodos necesarios. Puede utilizar una interfaz para representar todos los tipos que implementan la interfaz.
Hay respuestas que dicen que el polimorfismo es herencia, y eso no es correcto. Aunque puedes usar la herencia para crear un comportamiento polimórfico y generalmente eso es lo que haces, pero no es de eso de lo que se trata el polimorfismo.
Por un lado, no necesita la herencia para tener polimorfismo como se describe anteriormente.
En segundo lugar, el término "polimorfismo" es más significativo en el contexto del código del cliente que depende de la abstracción y no del código de implementación. El hecho de que tenga una súper clase y algunas otras clases que la heredan y que invalide algunos métodos no significa que sea un polimorfismo. Para crear un polimorfismo, debe escribir el código del cliente de forma polimórfica para consumir estas clases.