form code bindingcontext binding dynamic-binding static-binding

binding - code - xamarin forms label converter



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

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


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.


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.


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 la estructura Class<? extends Foo> klass , 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 estar 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).


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).


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. La vinculación tardía se refiere a las llamadas a funciones 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 de la vinculación temprana, la vinculación tardía 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 el enlace tardío.


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

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

La vinculación tardía usa CreateObject para crear una instancia del objeto de la 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 el 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 proyecto a la aplicación que desea manipular. En el Editor de VB de cualquier aplicación de Office, o en el propio VB, puede hacer esto seleccionando Herramientas + Referencias, y seleccionando la aplicación que desea de la 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 intentar obtener una instancia existente de Excel, y si eso devuelve un error, puede crear una nueva instancia en su controlador de errores.


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 el enlace tardío (en tiempo de ejecución), comprobará los métodos que se anulan en el tiempo de ejecución.

Por lo tanto, el método 1 (desde el niño - vinculación temprana) será anulado por el método1 desde el adulto en el tiempo de ejecución (vinculación tardía). 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á.