Estas son notas de estudio sobre diferentes métodos en C#:
【1】Métodos Virtuales -- virtual (como una abeja)
Propósito: Permiten que las clases hijas/clases derivadas los redefinan para implementar funcionalidades diferentes.
Característica: Facilita el mantenimiento.
【2】Métodos de Sobrescritura -- override
【3】Métodos Abstractos -- abstract (como un perezoso grande)
Definición: Deben estar en una clase abstracta, no pueden usar 'new' y carecen de implementación (cuerpo del método).
Uso: Son obligatorios y deben ser implementados por las clases que heredan.
Diferencias entre métodos abstractos e interfaces:
- Las clases abstractas permiten herencia simple, mientras que las interfaces permiten hernecia múltiple.
- Las clases abstractas pueden contener métodos regulares y virtuales, mientras que las interfaces solo definen especificaciones sin implementación.
Casos de uso:
- Clases abstractas: Para elementos que no cambian con frecuencia y tienen un alcance amplio, como "Persona" -> "Hombre" -> "Mujer".
- Interfaces: Para especificaciones que pueden cambiar con frecuencia.
【4】Métodos de Extensión -- ExtendMethod
Definición: Amplian la funcionalidad existente sin modificar el código fuente (clases o métodos).
Se implementan como métodos estáticos en clases estáticas.
Casos de uso:
- Extender objetos, propiedades o métodos de clases selladas.
- Extender interfaces.
- Programación en cadena con LINQ.
I. Métodos de Extensión
- Aplicación de métodos de extensión: Ampliando métodos de clases selladas
【1】Clase sellada:
namespace _016_Extensiones
{
/// <summary>
/// Supongamos que esta clase proviene de otra fuente, no es de nuestra autoría
/// </summary>
public sealed class Usuario
{
public string Nombre { get; set; }
public int Edad { get; set; }
public string Telefono { get; set; }
/// <summary>
/// Devuelve el número de teléfono
/// </summary>
/// <returns></returns>
public string ObtenerTelefono()
{
return Telefono;
}
}
}
【2】Agregando un método de extensión a la clase Usuario
namespace _016_Extensiones
{
/// <summary>
/// Definición de una clase estática
/// </summary>
public static class ExtensionUsuario
{
/// <summary>
/// Creación de un método estático
/// </summary>
public static void MostrarTelefono(this Usuario usuario)// this + tipo a extender: añade MostrarTelefono como método de extensión para Usuario
{
Console.Write("Resultado del método de extensión: ");
string numero = usuario.ObtenerTelefono();
Console.WriteLine(numero);
}
}
}
【3】Uso en el programa principal
Usuario usuario = new Usuario()
{
Edad = 30,
Nombre = "maria",
Telefono = "0987654321",
};
usuario.MostrarTelefono();// Ahora Usuario tiene el método MostrarTelefono
Resultado:
【4】Resumen de la definición de clases selladas
- Aplicación de métodos de extensión: Extensión de interfaces
【1】Definición de una interfaz
namespace _016_Extensiones
{
public interface IOperacionesMatematicas
{
int Sumar(int a, int b);
}
}
【2】Métodos de extensión para la interfaz
namespace _016_Extensiones
{
public static class ExtensionInterfaz
{
public static int Multiplicar(this IOperacionesMatematicas operaciones, int a, int b)
{
return a * b;
}
public static int Dividir(this IOperacionesMatematicas operaciones, int a, int b)
{
return a / b;
}
public static int Restar(this IOperacionesMatematicas operaciones, int a, int b)
{
return a - b;
}
}
}
【3】Clase que implementa la interfaz
namespace _016_Extensiones
{
public class CalculadoraBasica : IOperacionesMatematicas
{
public int Sumar(int a, int b)
{
return a + b;
}
}
}
namespace _016_Extensiones
{
public class CalculadoraAvanzada : IOperacionesMatematicas
{
public int Sumar(int a, int b)
{
return a + b;
}
}
}
【4】Uso en el programa principal
CalculadoraBasica basica = new CalculadoraBasica();
int resultado1 = basica.Sumar(5, 3);// método de la interfaz
int resultado2 = basica.Multiplicar(5, 3);// método de extensión
Console.WriteLine($"Resultado del método de interfaz: {resultado1}, Resultado del método de extensión: {resultado2}");
CalculadoraAvanzada avanzada = new CalculadoraAvanzada();
int resultado3 = avanzada.Sumar(10, 5);// método de la interfaz
int resultado4 = avanzada.Dividir(10, 5);// método de extensión
Console.WriteLine($"Resultado del método de interfaz: {resultado3}, Resultado del método de extensión: {resultado4}");
Resultado:
El contenido está incompleto, continuará...