Pregunta ¿Cuál es la diferencia entre la unión temprana y la tardía?


¿Cuál es la diferencia entre la vinculación temprana y la tardía?


75
2017-08-14 02:24


origen


Respuestas:


La respuesta corta es que la vinculación anticipada (o estática) se refiere a la vinculación de tiempo de compilación y la vinculación tardía (o dinámica) se refiere a la vinculación de tiempo de ejecución (por ejemplo, cuando utiliza la reflexión).


53
2017-08-14 02:16



En los lenguajes compilados, la diferencia es clara.

Java:

//early binding:
public create_a_foo(*args) {
 return new Foo(args)
}
my_foo = create_a_foo();

//late binding:
public create_something(Class klass, *args) {
  klass.new_instance(args)
}
my_foo = create_something(Foo);

En el primer ejemplo, el compilador puede hacer todo tipo de cosas ordenadas en tiempo de compilación. En el segundo, solo tienes que esperar que quien usa el método lo haga de manera responsable. (Por supuesto, las JVM más nuevas admiten Class<? extends Foo> klass estructura, que puede reducir enormemente este riesgo).

Otra ventaja es que los IDE pueden vincularse a la definición de la clase, ya que está declarada allí mismo en el método. La llamada a create_something (Foo) podría ser muy lejos de la definición del método, y si está mirando la definición del método, podría ser bueno ver la implementación.

La principal ventaja de la vinculación tardía es que facilita la inversión de control, así como ciertos otros usos del polimorfismo y el tipado de patos (si su lenguaje admite tales cosas).


15
2017-08-14 02:16



Tomado directamente de http://word.mvps.org/fAQs/InterDev/EarlyvsLateBinding.htm

Hay dos formas de usar Automatización (o Automatización OLE) para   controle programáticamente otra aplicación.

La vinculación tardía utiliza CreateObject para crear e instancia de   objeto de aplicación, que luego puede controlar. Por ejemplo, para crear   una nueva instancia de Excel usando el enlace tardío:

 Dim oXL As Object
 Set oXL = CreateObject("Excel.Application")

Por otro lado, para manipular una instancia existente de Excel (si   Excel ya está abierto) usaría GetObject (independientemente de si   está utilizando un enlace anticipado o tardío):

 Dim oXL As Object
 Set oXL = GetObject(, "Excel.Application")

Para utilizar el enlace anticipado, primero debe establecer una referencia en su   proyectar a la aplicación que desea manipular. En el Editor de VB de   cualquier aplicación de Office, o en VB en sí, puede hacer esto seleccionando   Herramientas + Referencias, y seleccionando la aplicación que desea desde   lista (por ejemplo, "Biblioteca de objetos de Microsoft Excel 8.0").

Para crear una nueva instancia de Excel utilizando el enlace anticipado:

 Dim oXL As Excel.Application
 Set oXL = New Excel.Application

En cualquier caso, por cierto, primero puede tratar de obtener una existente   instancia de Excel, y si eso devuelve un error, puede crear un nuevo   instancia en su controlador de errores.


6
2017-08-14 02:21



Respuesta similar pero más detallada de Herbert Schildt C ++ libro: -

La vinculación anticipada se refiere a los eventos que ocurren en tiempo de compilación. En esencia, la vinculación temprana ocurre cuando toda la información necesaria para llamar a una función se conoce en tiempo de compilación. (Dicho de otro modo, la vinculación anticipada significa que un objeto y una llamada a función están vinculados durante la compilación). Los ejemplos de vinculación anticipada incluyen llamadas a funciones normales (incluidas funciones de biblioteca estándar), llamadas a funciones sobrecargadas y operadores sobrecargados. La principal ventaja de la vinculación temprana es la eficiencia. Debido a que toda la información necesaria para llamar a una función se determina en tiempo de compilación, estos tipos de llamadas a funciones son muy rápidos.

Lo contrario de la unión temprana es la unión tardía. El enlace tardío se refiere para funcionar las llamadas que no se resuelven hasta el tiempo de ejecución. Las funciones virtuales se usan para lograr un enlace tardío. Como sabe, cuando el acceso se realiza a través de un puntero base o referencia, la función virtual realmente llamada está determinada por el tipo de objeto al que apunta el puntero. Como en la mayoría de los casos esto no se puede determinar en tiempo de compilación, el objeto y la función no están vinculados hasta el tiempo de ejecución. La principal ventaja del encuadernado tardío es la flexibilidad. A diferencia del enlace anticipado, el enlace tardío le permite crear programas que pueden responder a eventos que ocurren mientras el programa se ejecuta sin tener que crear un gran cantidad de "código de contingencia". Tenga en cuenta que debido a que una llamada a la función no se resuelve hasta el tiempo de ejecución, el enlace atrasado puede hacer que los tiempos de ejecución sean algo más lentos. Sin embargo, hoy en día, las computadoras rápidas han reducido significativamente los tiempos de ejecución relacionados con el enlace tardío.


4



En los idiomas interpretados, la diferencia es un poco más sutil.

Rubí:

# early binding:
def create_a_foo(*args)
  Foo.new(*args)
end
my_foo = create_a_foo

# late binding:
def create_something(klass, *args)
  klass.new(*args)
end
my_foo = create_something(Foo)

Debido a que Ruby (generalmente) no está compilado, no hay un compilador que haga las cosas interesantes por adelantado. El crecimiento de JRuby significa que ahora se compila más Ruby, haciéndolo actuar más como Java, arriba.

El problema con los IDE sigue en pie: una plataforma como Eclipse puede buscar definiciones de clase si las codifica, pero no puede si las deja al llamador.

La inversión de control no es muy popular en Ruby, probablemente debido a su extrema flexibilidad de tiempo de ejecución, pero Rails hace un gran uso de la vinculación tardía para reducir la cantidad de configuración necesaria para poner en marcha su aplicación.


3



public class child()
{    public void method1()
     {     System.out.println("child1");
     }
    public void method2()
     {     System.out.println("child2");
     }

}
public class teenager extends child()
{    public void method3()
     {      System.out.println("teenager3");
     }
}
public class adult extends teenager()
{     
    public void method1()
    {    System.out.println("adult1);
         super.method1();
     }
}


//In java
public static void main(String []args)
{    ((teenager)var).method1();
}

Esto se imprimirá

adult1
child1

En el enlace anticipado, el compilador tendrá acceso a todos los métodos en niños y adolescentes pero en la vinculación tardía (en tiempo de ejecución), comprobará si hay métodos anulados en tiempo de ejecución.

Por lo tanto, el método 1 (desde el niño - vinculación temprana) será anulado por el método1 de adulto en tiempo de ejecución (enlace tardío) Luego implementará el método 1 desde el niño ya que no hay método1 en el método1 en el adolescente.

Tenga en cuenta que si el niño no tiene un método1, entonces el código en el principal no se compilará.


0



El polimorfismo de tiempo de compilación también se denomina sobrecarga o unión temprana o enlace estático cuando tenemos el mismo nombre de método con comportamientos diferentes. Al implementar el prototipo múltiple del mismo método y el comportamiento diferente ocurre en él. La vinculación anticipada se refiere a la primera compilación del programa. Pero en el último objeto de enlace el tiempo de ejecución se produce en el programa. También se llama como enlace dinámico o anulación o polimorfismo en tiempo de ejecución.


0