¿Cuál es la diferencia entre Encuadernación Temprana y Tardía?


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

Author: James A. Rosen, 2008-08-14

7 answers

La respuesta corta es que el enlace temprano (o estático) se refiere al enlace en tiempo de compilación y el enlace tardío (o dinámico) se refiere al enlace en tiempo de ejecución (por ejemplo, cuando se utiliza reflexión).

 56
Author: Christian Hagelid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-14 03:39:22

En los lenguajes compilados, la diferencia es marcada.

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 en tiempo de compilación. En el segundo, solo hay que esperar que quien utiliza el método lo haga de manera responsable. (Por supuesto, las JVM más nuevas admiten la estructura Class<? extends Foo> klass, lo que puede reducir en gran medida este riesgo.)

Otro beneficio es que los IDE pueden enlazar a la definición de clase, ya que se declara allí mismo en el método. La llamada a create_something (Foo) podría estar muy lejos de la definición del método, y si estás mirando la definición del método, podría ser bueno ver la implementación.

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

 15
Author: James A. Rosen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-08 04:39:07

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

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

El enlace tardío utiliza CreateObject para crear e objeto de aplicación, que luego puede controlar. Por ejemplo, para crear una nueva instancia de Excel usando 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) utilizaría GetObject (independientemente de si está usando encuadernación temprana o tardía):

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

Para usar el enlace temprano, primero debe establecer una referencia en su proyectar a la aplicación que desea manipular. En el VB Editor de cualquier aplicación de Office, o en el propio VB, lo hace seleccionando Herramientas + Referencias, y seleccionando la aplicación que desee de la lista (por ejemplo, "Microsoft Excel 8.0 Object Library").

Para crear un nuevo instancia de Excel usando enlace temprano:

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

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

 6
Author: Ed S.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-07 02:34:28

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

El enlace temprano se refiere a eventos que ocurren en tiempo de compilación. En esencia, el enlace temprano ocurre cuando toda la información necesaria para llamar a una función se conoce en tiempo de compilación. (Dicho de otra manera, el enlace temprano significa que un objeto y una llamada a una función están enlazados durante la compilación.) Ejemplos de enlace temprano incluyen llamadas a funciones normales (incluidas las funciones de biblioteca estándar), llamadas a funciones sobrecargadas y sobrecargadas operador. La principal ventaja de la encuadernació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, este tipo de llamadas a funciones son muy rápidas.

Lo opuesto a la unión temprana es la unión tardía. Enlace tardío se refiere para llamadas a funciones que no se resuelven hasta tiempo de ejecución. Las funciones virtuales se utilizan para lograr el enlace tardío. Como usted sabe, cuando el acceso es a través de un puntero base o referencia, la función virtual realmente llamada está determinada por el tipo de objeto apuntado por el puntero. Debido a que 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 de la encuadernación tardía es la flexibilidad. A diferencia del enlace temprano, el enlace tardío le permite crear programas que pueden responder a los 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 una función no se resuelve hasta el tiempo de ejecución, el enlace tardío 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
Author: Pancuz Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-23 00:37:47

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

Ruby:

# 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 para hacer las ingeniosas cosas iniciales. El crecimiento de JRuby significa que más Ruby se compila en estos días, sin embargo, por lo que actúa 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 a la llama.

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

 3
Author: James A. Rosen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-14 02:21:56
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 imprimirá

adult1
child1

En el enlace temprano el compilador tendrá acceso a todos los métodos en niños y adolescentes pero en el enlace tardío (en tiempo de ejecución), comprobará los métodos que se anulan en tiempo de ejecución.

Por lo tanto method1 (de child binding early binding) será anulado por el method1 de adult en tiempo de ejecución (late binding) Luego implementará method1 desde niño ya que no hay method1 en method1 en adolescente.

Tenga en cuenta que si el niño no tenía un method1 entonces el código en el main no compilaría.

 0
Author: JBOND,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-22 08:41:57

El polimorfismo en tiempo de compilación también se llama sobrecarga o enlace temprano o enlace estático cuando tenemos el mismo nombre de método con diferentes comportamientos. Al implementar el prototipo múltiple del mismo método y se produce un comportamiento diferente en él. Early binding se refiere a la primera compilación del programa . Pero en el último objeto de enlace es tiempo de ejecución se produce en el programa. También se llama polimorfismo como enlace dinámico o sobreescritura o Tiempo de ejecución.

 0
Author: Ghousepeer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-15 03:34:34