Polimorfismo en C#: Enlace estático vs dinámico explicado
La palabra polimorfismo significa "tener muchas formas". En el paradigma de programación orientada a objetos, el polimorfismo se expresa a menudo como "una interfaz, múltiples funciones".
El polimorfismo puede ser estático o dinámico. En el polimorfismo estático, la respuesta a una función se determina en tiempo de compilación. En el polimorfismo dinámico, se decide en tiempo de ejecución.
Polimorfismo estático
El mecanismo de vincular una función con un objeto durante la compilación se llama early binding o enlace estático. C# proporciona dos técnicas:
- Sobrecarga de funciones (Function overloading)
- Sobrecarga de operadores (Operator overloading)
Sobrecarga de funciones
Puede tener múltiples definiciones para el mismo nombre de función en el mismo ámbito. La definición debe diferir en los tipos y/o número de argumentos. No se puede sobrecargar solo por tipo de retorno.
Ejemplo: Método print() para diferentes tipos
using System;
namespace AplicaciónPolimorfismo {
class ImprimirDatos {
void print(int i) {
Console.WriteLine("Imprimiendo int: {0}", i);
}
void print(double f) {
Console.WriteLine("Imprimiendo float: {0}", f);
}
void print(string s) {
Console.WriteLine("Imprimiendo string: {0}", s);
}
static void Main(string[] args) {
ImprimirDatos p = new ImprimirDatos();
p.print(5);
p.print(500.263);
p.print("Hello C#");
Console.ReadKey();
}
}
}
Resultado:
Imprimiendo int: 5
Imprimiendo float: 500.263
Imprimiendo string: Hello C#
Polimorfismo dinámico
C# permite crear clases abstractas que proporcionan implementación parcial de una interfaz. La implementación se completa cuando una clase derivada hereda de ella. Las clases abstractas contienen métodos abstractos, implementados por la clase derivada.
Reglas de clases abstractas:
- No se puede crear una instancia de una clase abstracta
- No se puede declarar un método abstracto fuera de una clase abstracta
- Una clase
sealedno puede heredarse; las clases abstractas no pueden sersealed
Ejemplo: Clase abstracta
using System;
namespace AplicaciónPolimorfismo {
abstract class Forma {
public abstract int área();
}
class Rectángulo : Forma {
private int longitud;
private int ancho;
public Rectángulo(int a = 0, int b = 0) {
longitud = a; ancho = b;
}
public override int área() {
Console.WriteLine("Área de clase Rectángulo:");
return (ancho * longitud);
}
}
class ProbadorRectángulo {
static void Main(string[] args) {
Rectángulo r = new Rectángulo(10, 7);
double a = r.área();
Console.WriteLine("Área: {0}", a);
Console.ReadKey();
}
}
}
Resultado:
Área de clase Rectángulo:
Área: 70
Cuando tiene una función definida en una clase que quiere que se implemente en clases heredadas, use funciones virtuales. Las funciones virtuales pueden implementarse de forma diferente en diferentes clases heredadas y la llamada se decide en tiempo de ejecución.
El polimorfismo dinámico se implementa mediante clases abstractas y funciones virtuales.
Ejemplo: Funciones virtuales
using System;
namespace AplicaciónPolimorfismo {
class Forma {
protected int ancho, alto;
public Forma(int a = 0, int b = 0) { ancho = a; alto = b; }
public virtual int área() {
Console.WriteLine("Área de clase padre:");
return 0;
}
}
class Rectángulo : Forma {
public Rectángulo(int a = 0, int b = 0) : base(a, b) { }
public override int área() {
Console.WriteLine("Área de clase Rectángulo:");
return (ancho * alto);
}
}
class Triángulo : Forma {
public Triángulo(int a = 0, int b = 0) : base(a, b) { }
public override int área() {
Console.WriteLine("Área de clase Triángulo:");
return (ancho * alto / 2);
}
}
class Llamador {
public void LlamarÁrea(Forma f) {
int a = f.área();
Console.WriteLine("Área: {0}", a);
}
}
class Probador {
static void Main(string[] args) {
Llamador c = new Llamador();
Rectángulo r = new Rectángulo(10, 7);
Triángulo t = new Triángulo(10, 5);
c.LlamarÁrea(r);
c.LlamarÁrea(t);
Console.ReadKey();
}
}
}
Resultado:
Área de clase Rectángulo:
Área: 70
Área de clase Triángulo:
Área: 25
Lenguaje C
- Clases y objetos en C#: Fundamentos para POO robusta
- Entendiendo los modificadores de acceso en C#: Public, Private, Protected, Internal y más
- Palabra clave static en C#: Dominando variables, métodos y clases estáticas
- Dominando clases y métodos abstractos en C#: Guía práctica
- Entendiendo clases anidadas en C#: Definición, uso y herencia
- Entendiendo clases y métodos parciales en C#
- Dominando las plantillas de clase en C++: guía práctica
- Dominando las clases internas anónimas en Java: Definición, sintaxis y ejemplos prácticos
- Dominando ObjectOutputStream de Java: Serialización, Métodos y Ejemplos Prácticos
- Dominando Java Generics: Construyendo Código Reutilizable y Type-Safe
- Dominando las operaciones de archivos en Java con java.io: creación, lectura, escritura y eliminación