Soy nuevo en OOP. Aunque entiendo qué es el polimorfismo, pero no puedo usarlo realmente. Puedo tener funciones con diferentes nombres. ¿Por qué debería intentar implementar polimorfismo en mi aplicación?Cuál es la verdadera importancia (uso) del polimorfismo
Respuesta
Respuesta clásica: Imagine una clase base Shape
. Expone un método GetArea
. Imagine una clase Square
y una clase Rectangle
, y una clase Circle
. En lugar de crear métodos separados GetSquareArea
, GetRectangleArea
y GetCircleArea
, puede implementar solo un método en cada una de las clases derivadas. No necesita saber qué subclase exacta de Shape
utiliza, simplemente llame al GetArea
y obtendrá el resultado, independientemente de qué tipo de concreto sea.
un vistazo a este código:
#include <iostream>
using namespace std;
class Shape
{
public:
virtual float GetArea() = 0;
};
class Rectangle : public Shape
{
public:
Rectangle(float a) { this->a = a; }
float GetArea() { return a * a; }
private:
float a;
};
class Circle : public Shape
{
public:
Circle(float r) { this->r = r; }
float GetArea() { return 3.14f * r * r; }
private:
float r;
};
int main()
{
Shape *a = new Circle(1.0f);
Shape *b = new Rectangle(1.0f);
cout << a->GetArea() << endl;
cout << b->GetArea() << endl;
}
Una cosa importante a notar aquí es - usted no tiene que saber el tipo exacto de la clase que se utilice, sólo el tipo de base, y obtendrás el resultado correcto. Esto es muy útil en sistemas más complejos también.
¡Diviértete aprendiendo!
Creo que el Rectángulo/Círculo es un mal ejemplo debido al clásico "problema de elipse" al que conduce naturalmente. Supongamos que tiene una clase de rectángulo con la que puede establecer el ancho y el alto, y luego una clase cuadrada que se extiende desde un rectángulo que establece el ancho y el alto al mismo tiempo. Entonces rect.Width * = 2; rect.Height * = 2; en realidad le da 4 veces las longitudes laterales. – Warty
@Warty para cualquiera que quiera leer más en esta búsqueda del Principio de Sustitución de Liskov. –
El polimorfismo le permite escribir código que usa objetos. Luego puede crear nuevas clases que su código actual puede usar sin modificaciones.
Por ejemplo, supongamos que tiene una función Lib2Groc(vehicle)
que dirige un vehículo de la biblioteca a la tienda de comestibles. Necesita indicar a los vehículos que giren a la izquierda, para que puedan llamar al TurnLeft()
en el objeto del vehículo, entre otras cosas. Entonces, si alguien más tarde inventa un vehículo nuevo, como un aerodeslizador, puede ser usado por Lib2Groc
sin ninguna modificación.
No necesita polimorfismo.
Hasta que lo hagas.
Entonces es increíble.
respuestasimple que va a lidiar con una gran cantidad de veces:
Alguien tiene que ir a través de una colección de cosas. Digamos que piden una colección de tipo MySpecializedCollectionOfAwesome. Pero has estado lidiando con tus instancias de Awesome as List. Entonces, ahora, tendrá que crear una instancia de MSCOA y llenarla con cada instancia de Awesome que tenga en su Lista < T>. Gran dolor en el trasero, ¿verdad?
Bueno, si pidieran un IEnumerable < Awesome>, podría entregarles una de las muchas colecciones de Awesome. Podría entregarles una matriz (Impresionante []) o una Lista (Lista < Impresionante>) o una colección observable de Impresionante o CUALQUIER COSA QUE guarde su Impresionante que implemente IEnumerable < T>.
El poder del polimorfismo le permite escribir con seguridad, pero ser lo suficientemente flexible como para usar una instancia de muchas formas diferentes sin crear toneladas de código que maneje específicamente este tipo o ese tipo.
En un lenguaje estrictamente tipado, el polimorfismo es importante para tener una lista/colección/conjunto de objetos de diferentes tipos. Esto se debe a que las listas/matrices están escritas para contener solo objetos del tipo correcto.
Imagínese, por ejemplo, tenemos los siguientes:
// the following is pseudocode M'kay:
class apple;
class banana;
class kitchenKnife;
apple foo;
banana bar;
kitchenKnife bat;
apple *shoppingList = [foo, bar, bat]; // this is illegal because bar and bat is
// not of type apple.
Para resolver esto:
class groceries;
class apple inherits groceries;
class banana inherits groceries;
class kitchenKnife inherits groceries;
apple foo;
banana bar;
kitchenKnife bat;
groceries *shoppingList = [foo, bar, bat]; // this is OK
También hace que el procesamiento de la lista de elementos más simples. Decir, por ejemplo todos los comestibles implementa el método price()
, procesando este es fácil:
int total = 0;
foreach (item in shoppingList) {
total += item.price();
}
Estas dos características son el núcleo de lo polimorfismo hace.
El polimorfismo es la base de la Programación Orientada a Objetos. Significa que un objeto se puede tener como otro proyecto. Entonces, ¿cómo el objeto puede convertirse en otra, su posible a través de seguir
- Herencia comportamiento
- Anulación/Implementación de la clase padre
- tiempo de ejecución vinculante objeto
Una de la principal ventaja de que es el interruptor implementaciones. Digamos que está codificando una aplicación que necesita hablar con una base de datos. Y por casualidad define una clase que realiza esta operación de base de datos para usted y se espera que haga ciertas operaciones como Agregar, Eliminar, Modificar. Usted sabe que la base de datos se puede implementar de muchas maneras, podría estar hablando con un sistema de archivos o un servidor RDBM como MySQL, etc. Por lo tanto, como programador, definiría una interfaz que podría usar, como ...
public interface DBOperation {
public void addEmployee(Employee newEmployee);
public void modifyEmployee(int id, Employee newInfo);
public void deleteEmployee(int id);
}
Ahora usted puede tener varias implementaciones, digamos que tenemos una para RDBMS y otra para el sistema de archivos directa
public class DBOperation_RDBMS implements DBOperation
// implements DBOperation above stating that you intend to implement all
// methods in DBOperation
public void addEmployee(Employee newEmployee) {
// here I would get JDBC (Java's Interface to RDBMS) handle
// add an entry into database table.
}
public void modifyEmployee(int id, Employee newInfo) {
// here I use JDBC handle to modify employee, and id to index to employee
}
public void deleteEmployee(int id) {
// here I would use JDBC handle to delete an entry
}
}
deja para tener la aplicación de base de datos de sistema de archivos
public class DBOperation_FileSystem implements DBOperation
public void addEmployee(Employee newEmployee) {
// here I would Create a file and add a Employee record in to it
}
public void modifyEmployee(int id, Employee newInfo) {
// here I would open file, search for record and change values
}
public void deleteEmployee(int id) {
// here I search entry by id, and delete the record
}
}
Veamos como principal puede cambiar entre los dos
public class Main {
public static void main(String[] args) throws Exception {
Employee emp = new Employee();
... set employee information
DBOperation dboper = null;
// declare your db operation object, not there is no instance
// associated with it
if(args[0].equals("use_rdbms")) {
dboper = new DBOperation_RDBMS();
// here conditionally, i.e when first argument to program is
// use_rdbms, we instantiate RDBM implementation and associate
// with variable dboper, which delcared as DBOperation.
// this is where runtime binding of polymorphism kicks in
// JVM is allowing this assignment because DBOperation_RDBMS
// has a "is a" relationship with DBOperation.
} else if(args[0].equals("use_fs")) {
dboper = new DBOperation_FileSystem();
// similarly here conditionally we assign a different instance.
} else {
throw new RuntimeException("Dont know which implemnation to use");
}
dboper.addEmployee(emp);
// now dboper is refering to one of the implementation
// based on the if conditions above
// by this point JVM knows dboper variable is associated with
// 'a' implemenation, and it will call appropriate method
}
}
Puede utilizar el concepto de polimorfismo en muchos lugares, un ejemplo praticle sería: permite que usted está escribiendo decorer imagen, y tiene que soportar todo el montón de imágenes tales como jpg, tif, png, etc. Por lo tanto, su aplicación definirá una interfaz y trabajará en ella directamente. Y tendrías un enlace en tiempo de ejecución de varias implementaciones para cada uno de jpg, tif, pgn, etc.
Otro uso importante es, si usas Java, la mayoría del tiempo trabajarías en la interfaz de la Lista, para que puede usar ArrayList hoy o alguna otra interfaz a medida que su aplicación crece o sus necesidades cambian.
¡bueno! eso es exactamente lo que mencioné en mi respuesta anterior. Ayuda en la llamada dinámica de funciones correctas. ! –
Supongo que a veces los objetos se llaman dinámicamente. No está seguro de si el objeto sería un triángulo, un cuadrado, etc. en una forma clásica poli. ejemplo.
Entonces, para dejar todo esto atrás, simplemente llamamos a la función de clase derivada y suponemos que se llamará a la de la clase dinámica.
No le importaría si es un cuadrado, triángulo o rectángulo. Solo te importa el área.Por lo tanto, se llamará al método getArea dependiendo del objeto dinámico pasado.
¿Alguna vez ha agregado dos enteros con +
, y luego agregó un número entero a un número de coma flotante con +
?
¿Alguna vez ha iniciado sesión x.toString()
para ayudarlo a depurar algo?
Creo que probablemente ya aprecies el polimorfismo, simplemente sin saber el nombre.
Uno de los beneficios más significativos que obtienes de las operaciones polimórficas es la capacidad de expansión. Puede usar las mismas operaciones y no cambiar las interfaces existentes y las implementaciones solo porque se enfrentó a la necesidad de algunas cosas nuevas.
Todo lo que queremos del polimorfismo es simplificar nuestra decisión de diseño y hacer que nuestro diseño sea más extensible y elegante. También debe llamar la atención sobre Open-Closed Principle (http://en.wikipedia.org/wiki/Open/closed_principle) y SOLID (http://en.wikipedia.org/wiki/Solid_%28Object_Oriented_Design%29) que pueden ayudarlo a comprender los principios clave de OO.
P.S. Creo que estás hablando de "polimorfismo dinámico" (http://en.wikipedia.org/wiki/Dynamic_polymorphism), porque hay algo así como "Polimorfismo estático" (http://en.wikipedia.org/wiki/Template_metaprogramming#Static_polymorphism).
La ventaja del polimorfismo es que el código del cliente no necesita preocuparse por la implementación real de un método. Observe el siguiente ejemplo. Aquí CarBuilder no sabe nada de ProduceCar(). Una vez que se le da una lista de autos (CarsToProduceList) producirá todos los autos necesarios en consecuencia.
class CarBase
{
public virtual void ProduceCar()
{
Console.WriteLine("don't know how to produce");
}
}
class CarToyota : CarBase
{
public override void ProduceCar()
{
Console.WriteLine("Producing Toyota Car ");
}
}
class CarBmw : CarBase
{
public override void ProduceCar()
{
Console.WriteLine("Producing Bmw Car");
}
}
class CarUnknown : CarBase { }
class CarBuilder
{
public List<CarBase> CarsToProduceList { get; set; }
public void ProduceCars()
{
if (null != CarsToProduceList)
{
foreach (CarBase car in CarsToProduceList)
{
car.ProduceCar();// doesn't know how to produce
}
}
}
}
class Program
{
static void Main(string[] args)
{
CarBuilder carbuilder = new CarBuilder();
carbuilder.CarsToProduceList = new List<CarBase>() { new CarBmw(), new CarToyota(), new CarUnknown() };
carbuilder.ProduceCars();
}
}
Aplicaciones pestañas
Una buena aplicación para mí es botones genéricos (para todas las pestañas) dentro de una aplicación con pestañas - incluso el navegador lo estamos utilizando está implementando polimorfismo ya que doesn' Conozca la pestaña que estamos usando en tiempo de compilación (dentro del código en otras palabras,). Siempre está determinado en el tiempo de ejecución (ahora mismo cuando estamos usando el navegador).
- 1. ¿Cuál es la importancia del retorno por referencia?
- 2. ¿Es este un uso apropiado del polimorfismo?
- 3. ¿Cuál es la importancia del 12 de octubre de 1999?
- 4. ¿Cuál es la importancia del esquema en el servidor sql?
- 5. ¿Cuál es la importancia de -532459699?
- 6. ¿Cuál es la importancia de # en SQL?
- 7. Genéricos, polimorfismo, interfaces: ¿cuál es la solución?
- 8. ¿Cuál es la importancia de IMetadataExchange en WCF?
- 9. ¿Cuál es la importancia de comenzar constantes con 'k'?
- 10. ¿Cuál es la importancia/uso de hacer vacío (param); al comienzo de la función?
- 11. ¿Cuál es la importancia de establecer la capacidad de `IList`?
- 12. ¿Por qué la salida Boolean.ToString es "Verdadera" y no "verdadera"
- 13. ¿Cuál es la importancia del nombre del índice cuando se crea un índice en MySQL?
- 14. ¿Cuál es la importancia de un guión bajo en Perl ($ _, @_)?
- 15. ¿Cuál es la importancia de 0.0f al inicializar (en C)?
- 16. ¿Cuál es la importancia de los tipos MIME correctos?
- 17. ¿Cuál es la importancia de "#" o "#!" que aparece en la url del sitio web
- 18. ¿Cuál es la importancia de la propiedad del constructor de Javascript?
- 19. ¿Cuál es la importancia del orden de las declaraciones en la salida de explicación de mysql?
- 20. Enlace tardío frente a polimorfismo: ¿cuál es la diferencia?
- 21. cuál es la diferencia entre las plantillas y el polimorfismo
- 22. ¿cuál es la diferencia entre herencia y polimorfismo?
- 23. ¿Es este el ejemplo del polimorfismo?
- 24. ¿Cuál es la verdadera ventaja de mantener el código fuera del código XAML?
- 25. Cuál es la importancia del pseudo encabezado utilizado en UDP/TCP
- 26. Importancia del sueño (0)
- 27. ¿Cuál es el propósito del uso?
- 28. ¿Cuál es el uso del uso de init() en JavaScript?
- 29. Semáforo: ¿Cuál es el uso del recuento inicial?
- 30. ¿Cuál es la verdadera diferencia entre la lematización y la derivación?
Eche un vistazo a: http://stackoverflow.com/questions/409969/polymorphism-define-in-just- dos oraciones – Zaki
Intento responder a esta pregunta en http://stackoverflow.com/questions/5854581/polymorphism-in-c/5854862#5854862, aunque esto se centra en el soporte de C++ para el polimorfismo, y otros lenguajes pueden tener un subtítulo o súper conjunto de las instalaciones mencionadas. Creo que cubre bastante bien el concepto ... espero que ayude. –