paint-brush
Sobrecarga vs. Anulando en C#por@samwalpole
56,037 lecturas
56,037 lecturas

Sobrecarga vs. Anulando en C#

por Sam Walpole4m2020/12/15
Read on Terminal Reader
Read this story w/o Javascript
tldt arrow
ES

Demasiado Largo; Para Leer

La sobrecarga y la anulación de métodos son dos formas comunes de polimorfismo en C# que a menudo se confunden debido a que sus nombres suenan similares. En este artículo, mostramos la diferencia entre los dos con algunos ejemplos prácticos de código. La sobrecarga es la capacidad de tener múltiples métodos dentro de la misma clase con el mismo nombre, pero con diferentes parámetros. La anulación se conoce como polimorfismo en tiempo de compilación (o estático) porque cada uno de los diferentes métodos sobrecargados se resuelve cuando se compila la aplicación. En C#, la sobrecarga es estática y la invalidación se determina en tiempo de compilación y estática.

Company Mentioned

Mention Thumbnail
featured image - Sobrecarga vs. Anulando en C#
Sam Walpole HackerNoon profile picture

La sobrecarga y la anulación de métodos son dos formas comunes de polimorfismo (la capacidad de que un método o clase tenga varias formas) en C# que a menudo se confunden debido a que sus nombres suenan similares. En este artículo, mostramos la diferencia entre los dos con algunos ejemplos prácticos de código.

Sobrecarga

La sobrecarga es la capacidad de tener múltiples métodos dentro de la misma clase con el mismo nombre, pero con diferentes parámetros. Cada uno de estos métodos también tiene su propia implementación, lo que significa que pueden comportarse de manera diferente según lo que se transmita.

La sobrecarga se conoce como polimorfismo en tiempo de compilación (o estático) porque cada uno de los diferentes métodos sobrecargados se resuelve cuando se compila la aplicación.

Para demostrar la sobrecarga, comencemos con una clase de calculadora que no usa sobrecarga:

 public class Calculator { public int AddTwoInt ( int a, int b ) => a + b; public int AddThreeInt ( int a, int b, int c ) => a + b +c; public double AddTwoDouble ( double a, double b ) => a + b; public double AddThreeDouble ( double a, double b, double c ) => a + b + c; }

Aquí tenemos 4 métodos diferentes, cada uno con nombres completamente diferentes, cada uno de los cuales realiza básicamente la misma función, solo en diferentes tipos y cantidades de parámetros. Es una interfaz bastante confusa porque debe recordar el nombre y los parámetros para cada método diferente.

En cambio, podríamos refactorizar esta clase para usar la sobrecarga:

 public class Calculator { public int Add ( int a, int b ) => a + b; public int Add ( int a, int b, int c ) => a + b +c; public double Add ( double a, double b ) => a + b; public double Add ( double a, double b, double c ) => a + b + c; }

Ahora todos los métodos se llaman simplemente Add, que es una interfaz mucho más sencilla de manejar como programador. ¡Simplemente podemos llamar al método Add con los parámetros que tenemos, y el compilador determinará automáticamente qué implementación real usar!

 var calc = new Calculator(); int a = 5 ; int b = 6 ; // calls int Add(int a, int b) calc.Add(a, b); double c = 4.2 double d = 5.41 double e = 2.57 // calls double Add(double a, double b, double c) calc.Add(c, d, e);

Primordial

La anulación, por otro lado, es la capacidad de redefinir la implementación de un método en una clase que hereda de una clase principal. Cuando se anula un método, el nombre y los parámetros siguen siendo los mismos, pero la implementación a la que se llama depende del tipo de objeto que lo llama.

La anulación se conoce como polimorfismo en tiempo de ejecución (o dinámico) porque el tipo del objeto que llama no se conoce hasta el tiempo de ejecución y, por lo tanto, la implementación del método que se ejecuta se determina en el tiempo de ejecución.

Como ejemplo, imagina que tenemos una clase base llamada Dog con un método Woof. Marcamos el método como virtual para indicar que este método puede ser anulado por clases heredadas.

 public class Dog { public virtual void Woof ( ) { Console.WriteLine( "Woof!" ); } }

Actualmente, esta y cualquier clase heredada usarán el método Woof definido en la clase Perro:

 public class BigDog : Dog { } var dog = new Dog(); var bigDog = new BigDog(); dog.Woof() // prints Woof! bigDog.Woof() // prints Woof!

Sin embargo, podemos optar por anular el método para que nuestras clases heredadas tengan una implementación diferente de Woof:

 public class YappyDog : Dog { public override void Woof ( ) { Console.WriteLine( "Woof! Woof! Woof!" ); } } var dog = new Dog(); var yappyDog = new YappyDog(); dog.Woof() // prints Woof! yappyDog.Woof() // prints Woof! Woof! Woof!

Aquí, la clase Dog base todavía usa su propia implementación, pero el YappyDog heredado tiene su propia implementación anulada que usa. La aplicación comprueba en tiempo de ejecución cuál es el tipo de clase (Dog o YappyDog) y llama al método para ese tipo en particular.

Conclusión

Aquí hemos comparado dos formas de polimorfismo en C#, sobrecarga y anulación. Hemos visto que:

  • La sobrecarga se determina en tiempo de compilación y es estática. La anulación se determina en tiempo de ejecución y es dinámica.
  • La sobrecarga se refiere a dar un método con el mismo nombre con diferentes parámetros. Preocupaciones anuladas que definen una implementación diferente del mismo método en clases heredadas.

Ya que es casi Navidad, también puede consultar mi publicación Los mejores regalos de Navidad para comprar un desarrollador que se presentó en Hashnode recientemente.

Publico principalmente sobre el desarrollo web full stack .NET y Vue. Para asegurarse de no perderse ninguna publicación, siga este blog y suscríbase a mi boletín . Si te ha resultado útil esta publicación, dale me gusta y compártela. También puedes encontrarme en Twitter .

Publicado anteriormente en https://samwalpole.com/the-difference- between-overloading-and-overriding-in-csharp