2012-06-06 21 views
13

genteLa sobrecarga es tiempo de compilación en tiempo de ejecución y de la anulación es?

me encontré con muchos hilos para la comprensión de polimorfismo (Tanto tiempo de compilación y tiempo de ejecución). Me sorprendió ver algunos enlaces donde los programadores están reclamando sobrecarga es tiempo de ejecución y de la anulación es el tiempo de compilación.

Lo que yo quiero saber de aquí es:

  1. Runtime polimorfismo con un ejemplo TIEMPO REAL y pequeño código y qué escenario que debemos utilizar.
  2. tiempo de compilación polimorfismo con el ejemplo en tiempo real y pequeño código y cuándo usar.

Porque leo muchas definiciones teóricas, pero no me satisface entender eso.

Además, pensé que donde también sentía, la sobrecarga debería ser tiempo de ejecución porque, supongo que tengo un método que calcula Área, en el tiempo de ejecución solo decide qué método sobrecargado llamar en función de los parámetros que paso (Say si paso un solo parámetro, se debe disparar la plaza, y si los parámetros son 2, se debe disparar Rectángulo) .... Así que no es que puedo reclamar su tiempo de ejecución? ¿Cómo es su tiempo? (La mayoría dice teóricamente que la sobrecarga es tiempo de compilación, pero ni siquiera dan un ejemplo de tiempo real correcto ... muy pocos afirman que es tiempo de ejecución) ...

Además, siento que anular es el tiempo de compilación porque, mientras escribes el código y complie, se asegura que utilizó la palabra clave virtual y también anulando de ese método en la clase derivada que de otro modo daría compila error de tiempo. Así que creo que es tiempo de compilación, de la misma manera en que lo vi en un hilo ..... Pero la mayoría de los hilos dice que es su tiempo de ejecución: D

Estoy confundido :(Esta pregunta es adicional a mi pregunta 1 y 2. Please ayudar con un ejemplo en tiempo real .. como ya estoy al tanto de las definiciones teóricas .... :(

Gracias ....

+0

If Entiendo su pregunta en absoluto: tiempo de ejecución, llamando a métodos virtuales. compilar el tiempo, llamando a cualquier otro método. –

+0

UhmmM Jeff, pero ¿se trata de eso? – Learner

Respuesta

11

En el caso de Sobrecarga, está utilizando un polimorfismo estático (en tiempo de compilación) porque el compilador sabe exactamente a qué método está llamando. Por ejemplo:

public static class test 
{ 
    static void Main(string[] args) 
    { 
     Foo(); 
     Foo("test"); 
    } 

    public static void Foo() 
    { 
     Console.WriteLine("No message supplied"); 
    } 

    public static void Foo(string message) 
    { 
     Console.WriteLine(message); 
    } 
} 

En este caso, el compilador sabe exactamente qué método foo() estamos llamando, basado en el número/tipo de parámetros.

Anulación es un ejemplo de polimorfismo dinámico (tiempo de ejecución). Esto se debe al hecho de que el compilador no necesariamente sabe qué tipo de objeto se está pasando en tiempo de compilación. Suponga que tiene las siguientes clases en una biblioteca:

public static class MessagePrinter 
{ 
    public static void PrintMessage(IMessage message) 
    { 
     Console.WriteLine(message.GetMessage()); 
    } 
} 

public interface IMessage 
{ 
    public string GetMessage(); 
} 

public class XMLMessage : IMessage 
{ 
    public string GetMessage() 
    { 
     return "This is an XML Message"; 
    } 
} 

public class SOAPMessage : IMessage 
{ 
    public string GetMessage() 
    { 
     return "This is a SOAP Message"; 
    } 
} 

En tiempo de compilación, que no saben si la persona que llama de esa función está pasando en un XMLMessage, un SOAPMessage, o posiblemente otro tipo de iMessage define en otra parte. Cuando el PrintMessage() es llamada, determina qué versión de GetMessage() para usar en tiempo de ejecución, con base en el tipo de I-Mensaje que se pasa en.

+3

Jon, debería trabajar con gente como tú por dos motivos: 1. Aprender cosas en tiempo real y de manera satisfactoria y por pasión en lugar de codificar por el bien de completar la tarea y que te paguen 2. Tu actitud al compartir tu conocimiento y lo más importante de una manera que puede llegar a la mente de las personas que hacen preguntas ... A diferencia de MSDN ...: (... Muchas gracias Jon, tu ejemplo hecho yo lo entiendo una mayor extensión del concepto ... Feliz :) Saludos – Learner

+0

simplemente para salir del problema de ''Foo': no ​​se pueden declarar miembros de instancia en una clase estática', tu método debe ser estático. – Rahul

+0

Me tomó un minuto entender lo que quería decir, pero veo que se está refiriendo a su edición. Gracias por señalar que declaraba miembros de instancia en una clase estática en el primer ejemplo. Arrojé apresuradamente ese ejemplo y no me di cuenta. –

3

Leer: Polymorphism (C# Programming Guide)

respuesta similar: Compile Time and run time Polymorphism

Bueno, hay dos tipos de El polimorfismo como se indica a continuación:

  • estático polimorfismo (enlace anticipado)
  • dinámico polimorfismo (late binding)

estático polimorfismo (enlace anticipado):

estático El polimorfismo es también conocida como polimorfismo de unión temprana y de tiempo de compilación. Método de sobrecarga y sobrecarga del operador son ejemplos de lo mismo.

Se le conoce como enlace porque el compilador es consciente de las funciones con el mismo nombre y también el que está sobrecargado función de Tobe llamada se conoce en tiempo de compilación.

Por ejemplo:

public class Test 
{ 
    public Test() 
    { 

    } 

    public int add(int no1, int no2) 
    { 

    } 

    public int add(int no1, int no2, int no3) 

    { 

    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Test tst = new Test(); 
     int sum = tst.add(10, 20); 

     // here in above statement compiler is aware at compile time that need to call function add(int no1, int no2), hence it is called early binding and it is fixed so called static binding. 
    } 
} 

dinámico Polimorfismo (Late Encuadernación):

public class Animal 
{ 
    public virtual void MakeSound() 
    { 
     Console.WriteLine("Animal sound"); 
    } 
} 

public class Dog:Animal 
{ 
    public override void MakeSound() 
    { 
     Console.WriteLine("Dog sound"); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Animal an = new Dog(); 
     an.MakeSound();   
     Console.ReadLine(); 
    } 
} 

Como en el código anterior, como cualquier otra llamada a un método virtual, será compilado a una instrucción callvirt IL. Esto significa que el método real que se llama se determina en tiempo de ejecución (a menos que el JIT pueda optimizar algún caso especial), pero el compilador comprobó que el método existe, eligió la sobrecarga más adecuada (si la hay) y tiene la garantía que el puntero de la función existirá en una ubicación bien definida en el vtable del tipo (incluso si se trata de un detalle de implementación). El proceso de resolver la llamada virtual es extremadamente rápido (solo necesita desreferenciar algunos punteros), por lo que no representa una gran diferencia.

+0

Pranay gracias. Pero ¿por qué solo cuando ingreso valor en el tiempo de ejecución, digamos solo 2 parámetros en su caso, decide llamar al método con 2 parámetros? Simplemente compila en tiempo de compilación ... cómo puede llamarlo como tiempo de compilación :(Su tiempo de ejecución porque en el tiempo de ejecución solo se basa en las entradas, dispara la función apropiada ... – Learner

+0

@Divine - su tiempo de compilación porque el compilador sabe tiene que llamar a qué método, por ejemplo, si el parámetro 2 está allí, el compilador detecta fácilmente que tiene que llamar al método de 2 parámetros solo ... si 3 que call gose a 3 parámetro ... –

+0

@ Divine-compiler sabe sobre la firma de métodos de la clase y que pueden resolverse fácilmente ... –

0
public class Animal { 
    public virtual void MakeSound() 
    { 
     Console.WriteLine("Animal sound"); 
    } } 

public class Dog:Animal { 
    public override void MakeSound() 
    { 
     Console.WriteLine("Dog sound"); 
    } } 

class Program { 
    static void Main(string[] args) 
    { 
     Animal an = new Dog(); 
     an.MakeSound();   
     Console.ReadLine(); 
    } } 

esto es polimorfismo dinámica, ya que se decide en runtime qué versión de MakeSound se llamará ya sea del padre o del hijo, ya que un niño no puede anular la función padre o puede anularla, pero todo esto se decide en el tiempo de ejecución, cuya versión se llama ....

Cuestiones relacionadas