2009-03-13 38 views
23

Los tiempos de enlace se pueden clasificar entre dos tipos: estáticos y dinámicos. ¿Cuál es la diferencia entre enlace estático y dinámico?¿Cuál es la diferencia entre la vinculación estática y dinámica?

¿Podría dar un ejemplo rápido de cada uno para ilustrarlo más?

+1

Si se trata de la tarea, que va a estar mejor pedir una crítica de su respuesta planificada; no por la respuesta abierta. –

+2

@Daniel L, lo marqué como tarea. Esta no es directamente la pregunta en mi tarea. Tengo que clasificar un montón de cosas como estáticas o dinámicas y estoy tratando de aclarar en mi cabeza cuál es cuál a través de esta pregunta. Si las personas quieren responder, lo harán. – KingNestor

+0

@KingNestor: Sí, vi que era tarea;] Veo lo que quiere decir ahora. –

Respuesta

26

En los términos más generales, estática vinculante significa que las referencias se resuelven en tiempo de compilación .

Animal a = new Animal(); 
a.Roar(); // The compiler can resolve this method call statically. 

unión dinámica significa que las referencias se resuelven en tiempo de ejecución .

public void MakeSomeNoise(object a) { 
    // Things happen... 
    ((Animal) a).Roar(); // You won't know if this works until runtime! 
} 
+1

No es cierto, si el objeto a = nuevo Animal(); –

+0

Es cierto, aunque creo que era obvio que estaba tratando de ser general. Lo ajusté un poco. –

+3

Su último ejemplo sigue siendo enlace estático. El tipo de difusión puede tener éxito o no, pero si la conversión de tipo tiene éxito, incluso si 'Roar' es un método virtual, el código se vinculará a la ranura vtable asociada estáticamente con' Animal.Roar() '. La vinculación dinámica solo se produce en C# cuando se usa el nuevo tipo 'dynamic', o si se usa Reflection (por ejemplo,' a.GetType(). GetMethod ("Roar"). Invoke (a, null) '). Esta última funcionaría con cualquier tipo que implemente un método sin parámetros llamado 'Roar', y devolverá la implementación más derivada (incluso si una implementación base no es virtual). – supercat

6

Depende de cuándo ocurre la vinculación: en tiempo de compilación (estático) o en tiempo de ejecución (dinámico). El enlace estático se usa cuando llamas a un método de clase simple. Cuando empiece a trabajar con jerarquías de clases y métodos virtuales, el compilador comenzará a usar el llamado VTABLE s. En ese momento, el compilador no sabe exactamente qué método llamar y tiene que esperar hasta el tiempo de ejecución para descubrir el método correcto que se va a invocar (esto se hace a través del VTABLE). Esto se llama enlace dinámico.

Consulte el artículo de Wikipedia en Virtual tables para obtener más detalles y referencias.

-4

Encuadernación realizada en tiempo de compilación es enlace estático y enlace hecho en tiempo de ejecución es enlace dinámico.En el tipo de datos de enlace estático del puntero resuelve qué método se invoca.Pero en el tipo de datos de enlace dinámico del objeto se resuelve qué método se invoca .

-4

* Tiempo de ejecución: - * enlaces de variables a sus valores, así como la vinculación de la variable a la ubicación de almacenamiento particular en el momento de la ejecución se llama enlace de tiempo de ejecución.

Puede ser de dos tipos

  1. en la entrada a un subprograma.
  2. En puntos arbitrarios durante el tiempo de ejecución.

tiempo de compilación de enlace: - (tiempo de traducción) Consta de los siguientes.

  1. Encuadernación elegida por el programador.
  2. Encuadernación elegida por el traductor.
  3. Encuadernación elegida por el cargador.
1

Me encontré con esta respuesta perfecta de un usuario de quora "Monis Yousuf". Él explica esto perfectamente. Lo estoy poniendo aquí para otros.

Encuadernación es principalmente un concepto de programación orientada a objetos relacionada con el polimorfismo.

En primer lugar, entérese de qué Polimorfismo es. Los libros dicen que significa "un nombre y formas múltiples". Es cierto, pero demasiado abstracto. Tomemos un ejemplo de la vida real.Usted va a un "Doctor", un médico puede ser un especialista en ORL, Neurocirujano, Homeópata, etc.

Aquí, un "médico" es un nombre y puede tener varios tipos; cada uno realizando su propia función. Esto es polimorfismo en la vida real.

Sobrecarga de función: Este concepto representa la vinculación estática. La sobrecarga de funciones puede definirse aproximadamente como dos o más métodos (funciones) que tienen el mismo nombre pero diferentes firmas (incluyendo número de parámetros, tipos de parámetros, diferentes tipos de retorno) se llaman métodos (o funciones) sobrecargados.

Supongamos que tiene que calcular el área de un rectángulo y un círculo. Vea el siguiente código: -

class CalculateArea { 

    private static final double PI = 3.14; 

    /* 
     Method to return area of a rectangle 
     Area of rectangle = length X width 
    */ 
    double Area(double length, double width) { 
     return (length * width); 
    } 

    /* 
     Method to return area of circle 
     Area of circle = π * r * r 
    */ 
    double Area(double radius) { 
     return PI * radius * radius; 
    } 
} 

En el código anterior, hay dos métodos "Área" con diferentes parámetros. Este escenario califica como sobrecarga de función.

Ahora, llegándonos a la verdadera pregunta: ¿Cómo es esta vinculación estática?

Cuando llama a cualquiera de las funciones anteriores en su código, debe especificar los parámetros que está pasando. En este escenario, se pasa a cualquiera:

  • dos parámetros de tipo double [¿Qué va a llamar el primer método, a calcular son de un rectángulo]
  • parámetro individual de tipo double [¿Qué va a llamar a la segunda método, para calcular el área de un círculo]

Dado que, en tiempo de compilación el compilador de Java pueden averiguar, que funcionan para llamar, es tiempo de compilación (o estática) de unión.

Anulación de función: Anulación de función es un concepto que se muestra en herencia. Puede definirse aproximadamente como: cuando hay un método presente en una clase padre y su subclase también tiene el mismo método con la MISMA firma, se llama anulación de función. [Hay más en ello, pero en aras de la simplicidad, he escrito esta definición] Será más fácil de entender con la siguiente pieza de código.

class ParentClass { 
    int show() { 
     System.out.println("I am from parent class"); 
    } 
} 

class ChildClass extends ParentClass{ 
    int show() { 
     System.out.println("I am from child class"); 
    } 
} 

class SomeOtherClass { 
    public static void main (String[] s) { 
     ParentClass obj = new ChildClass(); 
     obj.show(); 
    } 
} 

En el código anterior, el método show() se ser manipulables como la misma firma (y nombre) está presente en ambas clases de padres e hijos.

En la tercera clase, SomeOtherClass, Una variable de referencia (obj) del tipo ParentClass tiene el objeto de ChildClass. A continuación, se llama al método show() desde la misma variable de referencia (obj).

Una vez más, la misma pregunta: ¿Cómo es este enlace dinámico?

En tiempo de compilación, el compilador comprueba que la variable de referencia sea del tipo ParentClass y comprueba si el método show() está presente en esta clase. Una vez que comprueba esto, la compilación es exitosa.

Ahora, cuando el programa EJECUTAR, ve que el objeto es ChildClass y, por lo tanto, ejecuta el método show() del ChildClass. Dado que esta decisión se toma en RUNTIME, se llama Enlace dinámico (o Polimorfismo en tiempo de ejecución).

Link para la respuesta original

Cuestiones relacionadas