sobrecarga que polimorfismo parametrico libro form definicion caracteristicas c# oop

c# - que - polimorfismo y sobrecarga



Polimorfismo de tiempo de compilaciĆ³n vs. polimorfismo de tiempo de ejecuciĆ³n (10)

Bueno, las decisiones de sobrecarga (qué firmas de métodos se usan, basadas en los argumentos 1 ) son tomadas por el compilador, mientras que las decisiones de primordiales (qué implementaciones de métodos se usan, basadas en el tipo de objetivo del método) las toma CLR en Tiempo de ejecución.

Sin embargo, normalmente no llamaría "polimorfismo" de sobrecarga. En mi experiencia, la palabra usualmente se refiere a anular. Supongo que la sobrecarga no le permite tratar un objeto de un tipo como otro, aunque la sobrecarga en sí misma no tiene por qué involucrarse allí, simplemente son conversiones de tipo normales.

Aquí hay un ejemplo que muestra que la opción de sobrecarga se realiza en tiempo de compilación:

using System; class Test { static void Foo(object a) { Console.WriteLine("Object overload called"); } static void Foo(string a) { Console.WriteLine("String overload called"); } static void Main() { object x = "hello"; Foo(x); } }

Aquí se llama a la sobrecarga de Foo(object) porque x es de tipo object en el momento de la compilación; solo en el momento de la ejecución se sabe que se refiere a una cadena.

Compare eso con este ejemplo:

using System; class Base { public virtual void Foo() { Console.WriteLine("Base.Foo called"); } } class Derived : Base { public override void Foo() { Console.WriteLine("Derived.Foo called"); } } class Test { static void Main() { Base x = new Derived(); x.Foo(); } }

Aquí, el tipo de tiempo de compilación de x es Base , pero todavía se llama al método de reemplazo de la clase derivada, porque el tipo de tiempo de ejecución del objeto al que x refiere es Derived .

1 De hecho, es un poco más complicado que eso, debido a la ocultación de métodos, etc., pero en casos simples se puede pensar que se trata simplemente de elegir la firma.

¿Por qué la sobrecarga se denomina polimorfismo de tiempo de compilación y anulación del polimorfismo de tiempo de ejecución en C #?


Las funciones anuladas son funciones que tienen la misma firma, pero se implementan en diferentes clases derivadas. En el momento de la compilación, generalmente el tipo de clase base se usa para hacer referencia a un objeto, aunque en el tiempo de ejecución este objeto podría ser de un tipo derivado, por lo que cuando se llama a un método anulado, la implementación a la que se llama depende de qué tipo de objeto es haciendo la llamada (base vs. un tipo derivado) que es desconocido en tiempo de compilación.

La sobrecarga (no realmente el polimorfismo) es simplemente múltiples funciones que tienen el mismo nombre pero diferentes firmas (piense en múltiples constructores para un objeto que toma diferentes números de argumentos). El método al que se llama se conoce en tiempo de compilación, porque los argumentos se especifican en este momento.


Los ejemplos clásicos de polimorfismo estático se basan en la metaprogramación de plantillas o en la tipificación de pato, pero no en la sobrecarga de métodos.

El polimorfismo estático significa que la desición se realiza mediante compilación (estática), y el polimorfismo dinámico significa que la desición se realiza solo en tiempo de ejecución (dinámicamente).


Polimorfismo

El polimorfismo significa muchas formas (capacidad de tomar más de una forma). En Polimorfismo, poli significa "múltiple" y morfo significa "formas", por lo que polimorfismo significa muchas formas.

En el polimorfismo, declararemos métodos con el mismo nombre y diferentes parámetros en la misma clase o métodos con el mismo nombre y los mismos parámetros en diferentes clases. El polimorfismo tiene la capacidad de proporcionar una implementación diferente de los métodos que se implementan con el mismo nombre.

En Polimorfismo tenemos 2 tipos diferentes que son

- Compile Time Polymorphism (Called as Early Binding or Overloading or static binding) - Run Time Polymorphism (Called as Late Binding or Overriding or dynamic binding)

Polimorfismo de tiempo de compilación

El polimorfismo de tiempo de compilación significa que declararemos métodos con el mismo nombre pero con firmas diferentes, por lo que realizaremos diferentes tareas con el mismo nombre de método. Este polimorfismo de tiempo de compilación también se denomina como enlace temprano o sobrecarga de métodos.

Método El tiempo de sobrecarga o el polimorfismo de compilación significan los mismos nombres de métodos con diferentes firmas (diferentes parámetros)

Para más detalles revisa este enlace polimorfismo en c #

Polimorfismo del tiempo de ejecución

El polimorfismo en tiempo de ejecución también se denomina vinculación tardía o anulación del método o polimorfismo dinámico. El polimorfismo en tiempo de ejecución o la anulación de métodos significa los mismos nombres de métodos con las mismas firmas.

En este tiempo de ejecución, el polimorfismo o la anulación del método podemos anular un método en la clase base mediante la creación de una función similar en la clase derivada. Esto se puede lograr mediante el uso del principio de herencia y el uso de palabras clave de "anulación virtual".


Porque en el momento de la compilación se sabe a cuál de sus funciones sobrecargadas se llama, pero ese no es siempre el caso de una función anulada.


Se llama polimorfismo en tiempo de ejecución porque el comportamiento se decide en tiempo de ejecución, no en tiempo de compilación.

Cuando llama a un método como objectVariable.Method (), el método al que llamará su máquina dependerá de qué instancia de clase esté presente en la objectVariable y se decidirá después de asignarle una instancia de la clase. Esto sucederá en tiempo de ejecución y no en tiempo de compilación. Y de ahí el nombre de "polimorfismo en tiempo de ejecución".

Puede leer más en: ¿Cuál es la diferencia entre el tiempo de compilación y el polimorfismo en tiempo de ejecución?


Tiempo de ejecución Ejemplo de polimorfismo en c #.

using System; public class demo{ public static void Main(String[] args){ cal cal ; add a = new add(); cal = a; Console.WriteLine("Addition is" + cal.calculate(20, 20)); sub s = new sub(); cal = s; Console.WriteLine("Substraction is" + cal.calculate(20, 20)); mul m = new mul(); cal = m; Console.WriteLine("Multiplication is" + cal.calculate(20, 20)); div d = new div(); cal = d; Console.WriteLine("Division is" + cal.calculate(20, 20)); Console.ReadLine(); } } public abstract class cal{ public abstract int calculate(int a, int b); } public class add : cal { public override int calculate(int a ,int b){ return a+b; } } public class sub : cal{ public override int calculate(int a, int b){ return a-b; } } public class mul : cal{ public override int calculate(int a, int b){ return a*b; } } public class div : cal{ public override int calculate(int a, int b){ return a/b; } }


Polimorfismo

A través de la herencia, una clase puede usarse como más de un tipo; se puede usar como su propio tipo, cualquier tipo de base o cualquier tipo de interfaz si implementa interfaces. Esto se llama polimorfismo.

Polimorfismo significa tener más de una forma. La sobrecarga y la anulación se utilizan para implementar el polimorfismo. El polimorfismo se clasifica en polimorfismo de tiempo de compilación o unión temprana o unión estática y polimorfismo de tiempo de ejecución o unión tardía o unión dinámica.

Anulación: los mismos nombres de método con los mismos argumentos y los mismos tipos de retorno asociados en una clase y su subclase. La anulación en C # hace uso de la palabra clave "anular". Anular un método significa reemplazarlo con una nueva forma de manejar los datos.

Sobrecarga: el mismo nombre de método con diferentes argumentos, puede o no ser el mismo tipo de retorno escrito en la misma clase.

Tiempo de compilación Polimorfismo o enlace temprano

El polimorfismo en el que el compilador identifica qué forma polimórfica tiene que ejecutar en el momento de la compilación en sí mismo se denomina polimorfismo de tiempo de compilación o unión temprana.

La ventaja de la vinculación temprana es la ejecución será rápida. Porque todo lo relacionado con el método es conocido por el compilador durante la compilación y la desventaja es la falta de flexibilidad.

Los ejemplos de enlace temprano son los métodos sobrecargados, los operadores sobrecargados y los métodos anulados que se llaman directamente mediante el uso de objetos derivados.

Polimorfismo en tiempo de ejecución o vinculación tardía

El polimorfismo en el que el compilador identifica qué forma polimórfica se debe ejecutar en tiempo de ejecución pero no en tiempo de compilación se denomina polimorfismo de tiempo de ejecución o enlace tardío.

La ventaja de la vinculación tardía es la flexibilidad y la desventaja es que la ejecución será lenta, ya que el compilador tiene que obtener la información sobre el método para ejecutar en tiempo de ejecución.

Ejemplo de enlace tardío es métodos anulados que se llaman usando el objeto de clase base.

class A { public virtual void Leg(string Name) { } } class B:A { public override void Leg(string Name) { } }

Ejemplo para sobre carga

class A { void a() { } void a(string Name) { } }

En otras palabras, "muchas formas de un solo objeto se llaman polimorfismo".

P.ej:

Un líder de equipo se comporta con Subordenada. Un líder de equipo se comporta con sus mayores. Un líder de equipo se comporta con otros líderes de equipo.

Aquí Team Leader es un objeto pero la actitud es diferente en diferentes situaciones.

Diferencia entre anulación del método y ocultación del método

La anulación de métodos permite que una subclase proporcione una implementación específica de un método que ya proporciona la clase base. La implementación en la subclase anula (reemplaza) la implementación en la clase base. Lo importante que hay que recordar acerca de la invalidación es que el método que está haciendo la invalidación está relacionado con el método en la clase base. Cuando se llama a un método virtual en una referencia, el tipo real del objeto al que se refiere la referencia se usa para determinar qué método de implementación se debe usar. Cuando un método de una clase base se invalida en una clase derivada (subclase), se usa la versión definida en la clase derivada. Esto es así incluso si la aplicación que llama no es consciente de que el objeto es una instancia de la clase derivada.

La ocultación de métodos no tiene una relación entre los métodos de la clase base y la clase derivada. El método en la clase derivada oculta el método en la clase base.


Tiempo de compilación polimorfismo

Tiempo de compilación El polimorfismo también se conoce como sobrecarga de métodos. La sobrecarga de métodos significa tener dos o más métodos con el mismo nombre pero con firmas diferentes.

Polimorfismo en tiempo de ejecución

Tiempo de ejecución El polimorfismo también se conoce como anulación del método. La anulación de métodos significa tener dos o más métodos con el mismo nombre y la misma firma, pero con una implementación diferente


polimorfismo de tiempo de compilación

Supongamos que digamos que tienes 2 métodos de la siguiente manera; ya que el método comparte el mismo nombre pero tiene diferentes parámetros; Se llama como método "sobrecargado". Comer (cadena de alimentos); Comer (cadena de comida, cuerda SpoonOrFork);

y estas usando asi en tu clase de cena

public class Man { public bool Eat (string food) { //implementation } public bool Eat (string food, string SpoonOrFork) { //implementation } } public class dinner { public bool Start() { string food = "course1"; Man.Eat ( food); } }

Ahora, cuando compila este programa, el compilador sabe exactamente a qué versión del método Eat llamar durante el tiempo de compilación (debido a la diferencia en los parámetros).

Es por eso que se denomina como polimorfismo de tiempo de compilación.

Polimorfismo en tiempo de ejecución

public class chimp { public virtual void walk() { Console.WriteLine("I am walking using 4 legs"); } } public class neanderthals : chimp { public override void walk() { Console.WriteLine("I am walking using 2 legs"); } } class Program { static void Main(string[] args) { chimp x = new neanderthals(); x.walk(); Console.ReadLine(); // this will give an output of "I am walking using 2 legs" } }

En el código anterior x es de tipo chimpancé . Aunque el compilador piensa que va a llamar al método de caminar en chimpancé; Pero eso no es lo que realmente sucede . Dado que depende de CLR (tiempo de ejecución), este tipo de polimorfismo se denomina polimorfismo de "tiempo de ejecución".