2008-08-14 10 views
73

¿Cuál es la diferencia entre principios y finales de unión?¿Cuál es la diferencia entre el enlace primero y reciente?

+0

[Enlace anticipado y anticipado] (http://calculist.blogspot.com/2006/05/late-and-early-binding.html) – jfs

+4

Sería un error decir early = llamar a la función directa while late = call para funcionar a través de un puntero de función? Nunca deja de sorprenderme cómo los programadores tienen una manera de tomar conceptos simples y hacerlos parecer mucho más complejos de lo que son (como una demostración de inteligencia). La programación es intrínsecamente un campo de estudio muy sencillo hasta que se llega a cosas como la forma en que se hace un tipo de letra flotante o el desarrollo de compiladores. –

Respuesta

52

La respuesta corta es que el enlace anticipado (o estático) se refiere al enlace del tiempo de compilación y el enlace atrasado (o dinámico) se refiere al enlace del tiempo de ejecución (por ejemplo, cuando usa el reflejo).

+7

Pero el artículo de wikipedia sobre el enlace tardío (http://en.wikipedia.org/wiki/Late_binding) dice que "el enlace tardío a menudo se confunde con el envío dinámico, pero existen diferencias significativas". Entonces, ¿son lo mismo o no? Si son iguales, entonces esa página de wikipedia debe ser cambiada. –

+1

Mejor respuesta de stackoverflow aquí http://stackoverflow.com/questions/484214/early-and-late-binding – Baggers

5

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

Hay dos formas de usar Automation (o automatización OLE) para controlar mediante programación de otra aplicación.

Encuadernación tardía utiliza CreateObject para crear y instancia del objeto de aplicación , que luego puede controlar. Por ejemplo, para crear una nueva instancia de Excel usando el enlace en tiempo:

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

Por otra parte, para manipular una instancia existente de Excel (si Excel ya está abierto) que usaría GetObject (independientemente de si que está utilizando temprana o tardía de unión):

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

para utilizar el enlace anticipado, primero tiene que establecer una referencia en su proyecto a la aplicación que desea manipular. En el Editor de Visual Basic de cualquier aplicación de Office, o en VB en sí, esto se hace mediante la selección de Herramientas + referencias, y seleccionar la aplicación que desee de la lista (por ejemplo, “Microsoft Excel 8.0 Object Library”).

Para crear una nueva instancia de Excel utilizando enlace anticipado:

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

En cualquier caso, dicho sea de paso, primero puede tratar de conseguir un instancia existente de Excel, y si eso devuelve un error, puede crear una nueva instancia en su gestor de errores.

+3

Sé que esta respuesta es antigua y proviene de otro lado, pero no es precisa. La vinculación tardía implica el uso de CreateObject, pero CreateObject no implica necesariamente una vinculación tardía. La vinculación no se aplica al método de instanciar un objeto, solo a cómo se declara. Si declara su objeto "Como aplicación de Excel", no importa cómo lo instancia. Siempre utilizo CreateObject para crear instancias de referencias de objetos a bibliotecas externas, de esa manera puedo cambiar entre el enlace inicial y el final y solo tengo que cambiar una línea (no dos), la línea que declara el objeto. – JimmyPena

15

En idiomas compilados, la diferencia es absoluta.

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

Otra ventaja es que los IDE pueden vincularse a la definición de clase, ya que está declarada allí mismo en el método. La llamada a create_something (Foo) puede ser muy 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 de polimorfismo y pato-tipado (si su lenguaje admite tales cosas).

3

En 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 es (generalmente) no compilado, no es un compilador de hacer las cosas por adelantado ingenioso. 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 del enlace posterior para reducir la cantidad de configuración necesaria para poner en marcha su aplicación.

+0

Este punto se aplica también a los lenguajes compilados que pueden incluir componentes compilados JIT e incluidos en el tiempo de ejecución para implementar complementos o marcos dinámicos. Algunos ejemplos canónicos de esto existen en Java, y por supuesto Ruby y Python también. Un ejemplo extremo es Erlang, donde el tiempo de ejecución puede cargar dos versiones de cualquier módulo a la vez para actualizaciones/degradaciones en vivo. Así que, aunque una gran cantidad de código de Erlang (¿la mayoría?) Está escrito como funciones puras estáticas de forma estática, los requisitos de tiempo de ejecución exigen el enlace tardío y los tipos dinámicos bajo el capó. – zxq9

4

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

Enlace temprano se refiere a los acontecimientos que se producen 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 vinculación anticipada es la vinculación tardía. La vinculación tardía se refiere al 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 una 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 la vinculación tardía.

+1

"el objeto y la función no están vinculados hasta el tiempo de ejecución" Esta afirmación parece implicar que existe un objeto antes de ejecutar hora. ¿Los objetos no son puramente entidades de tiempo de ejecución? Es la clase del objeto que existe en tiempo de compilación. Esto podría decirse mejor como "la llamada de función y su implementación no están vinculadas hasta el tiempo de ejecución" – programmerravi

0
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 

A principios de la unión del compilador tendrá acceso a todos los métodos en infantil y adolescente pero en el enlace en tiempo (en tiempo de ejecución), se comprobará métodos que se reemplazan en tiempo de ejecución.

Por lo tanto method1 (desde child - early binding) será reemplazado por el método1 de adulto en tiempo de ejecución (enlace tardío) Luego implementará method1 desde child ya que no hay method1 en method1 en teenager.

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

0

El polimorfismo de tiempo de compilación también se denomina 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 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 se produce el tiempo de ejecución en el programa. También se llama como enlace dinámico o anulación o polimorfismo en tiempo de ejecución.

Cuestiones relacionadas